ScSami
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
24
13 déc. 2005 à 02:37
Note que ton approche du problème par une piste en 2D vue du dessus n'est pas obligatoirement la seule approche possible... Il faut parfois jouer sur l'imprécision et la connerie des profs!
Pour la piste, tu as en effet compris la technique : cacher un mask (image en noir&blanc) dans un PictureBox invisible.
En revanche, ta voiture ne doit pas être dans un PictureBox mais dans un contrôle "Image" lui-même placé dans un PictureBox. Ensuite, il te suffit de faire bouger le contrôle de ta voiture (bcp plus simple pour l'affichage!!!).
Mais un problème demeure cependant... : LA TRANSPARENCE.
En effet, le fait que le fond de tes images de voiture soit gris comme la piste exclu le fait que la voiture puisse aller dans l'herbe puisqu'elle sera entourée de gris!!! On verra alors que c'est un vulgaire carré!
Deux solutions : Utiliser des GIFs (en définissant la couleur de transparence) [cf. le logiciel "Ulead GIF Animator 3" ou un gratuit... cf. www.telecharger.com], utiliser une couleur de transparence (p. ex. le magenta) puis de dessiner sur le PictureBox via la fonction PaintPicture.
Le mieux étant d'utiliser des GIFs transparentes, bien entendu!
Une fois ce choix crucial effectué, d'autres problèmes sont à soulever...
Si tu utilises la technique du pickpoint, pense à picker 4 points pour les 4 angles de la voiture. Ceci lui donnera un réalisme bienvenu pour l'interaction. Ceci dit, rien ne t'empêche, si tu utilises l'API GetPixel de picker tous les pixels de la voiture ou uniquement tous ceux de son contour !
Enfin, selon la vitesse et la propreté du code que tu veux tu choisis la technique. Mais pense à éventuellement protégé aussi les flans de la voiture via, p.ex. 2 points supplémentaires (donc 6 pour faire ça proprement).
Il faudra trouver un système pour les stocker pour chaque rotation... Un tableau serait, je pense, le bienvenu (24imgs*6pts*2[x,y] = 288 cells).
De manière générale, lorsque tu veux faire référence à une touche, utilise de préférence les constantes deVisual BASIC. Elles commençent toutes par "vb". Ensuite, pour les touches clavier par exemple, "key" puis le nom de la touche.
vbKeyUp
vbKeyDown
vbKeyLeft
vbKeyRight
Cependant, si tu as le temps (j'ignore le délais impartit), tu peux toujours mettre en place la customisation des touches via le captage et la mémorisation de leur code ce qui, évidemment, t'évitera d'utiliser une constante (utilisation de variables donc!).
Donc, au cas où tu ais le temps, fait un truc du genre :
Public varKeyCodeUp, varKeyCodeDown, varKeyCodeLeft, varKeyCodeRight As Integer
...
Private Sub Form_Load ...
varKeyCodeUp = vbKeyUp
varKeyCodeDown = vbKeyDown
...
End Sub
...
If Keycode = varKeyCodeUp Then ...
Pour le coté graphique, tu peux faire plein de trucs...
Bon, je t'avouerais que je ne connais pas personnellement Warcraft même si je suis certain qu'il est très gentil . Blague à part, utilise l'avantage de la map(piste) fixe. Il va sans dire que VB utilise le système de couches graphiques pour l'affichage des objets (normal dans Windows...). Comme pour les objets dans Word, tu peux paramétrer leur ordre sur l'axe des Z (d'où le terme Z-Order). Autrement dit, tu peux rapprocher ou éloigner chaque objet graphique puisqu'ils utilisent chacun une couche unique. Autrement dit, il ne peut pas y avoir deux objets sur une même couche et donc, à un même niveau. Donc, à l'exception de l'objet le plus devant, chaque objet est succeptible d'être recouvert par un autre, que ce soit partiellement ou entièrement.
Du coup, si tu utilises une map-mask cachée pour les collisions et un contrôle "Image" pour la voiture, rien ne t'empêche de jouer avec le graphisme et les capacités graphiques intrinsèques de Windows !!! Par exemple, rien ne t'empêche de rajouter un pont... puisque la voiture passera, quoi qu'il arrive, dessous (si le Z-Order de ce dernier est suppérieur à celui de la voiture!). Autrement dit, ce ne sera pas à toi de gérer cet aspect du graphisme (puisque Windows le gère très bien par défaut!) et entre nous, un truc de moins à gérer est toujours le bienvenu dans ce genre de projets!
Alors, le pont, bien évidemment, il faut le mettre dans un contrôle Image dans la PictureBox, faire un clique droit et dire "Mettre au premier plan" (ou plutôt, mettre la voiture "en arrière plan" à la fin!).
Tu peux aussi facilement mettre des arbres. Le feuillage étant dessus et le tronc, plus petit, étant dans la map-mask pour la collision. Du coup, la voiture pourra être à moitié dans le feuillage et être bloquée.
D'autres éléments graphiques sont aussi facilement insérables comme une rivière, ... puisque la map graphique n'a aucune importance pour le code!
Cependant, lorsque je parle de pont, attention : je parle d'un pont pour piétons, pas pour que la voiture puisse passer une fois dessus et une fois dessous!!! Encore que, avec un peu d'astuce, ce ne serait pas très compliqué à programmer...
Bref, y'a de quoi s'amuser un bon coup.
L'autre point a éclaircir est la gestion de la vitesse de la voiture ! Deux techniques sont possibles : via l'horloge (ou un Timer) ou en vitesse relative au processeur la meilleur étant la première.
La vitesse c'est le nombre de pixels/cycle. Un cycle pouvant être soit du temps (seconde), soit une boucle. L'accélération, elle, ne se fait qu'un temps tout comme la décélération. En effet, la voiture ne s'arrêtera pas brutalement (sauf si tu mets un frein...). D'ailleurs, tu peux parfaitement, histoire de bien la matérialiser, mettre un compteur de vitesse en plus du Chrono.
D'ailleurs, si tu utilises un mask en 256 couleurs (nuances de gris ou autre) tu peux parfaitement simuler différents terrains (graviers, boue, bitume, herbe, eau, pavés, terre battue, ...) avec des propriétés de vitesse max et d'accélération différentes.
Pour la gestion du temps, outre le contrôle Timer qui est un peu lourd, tu peux utiliser une bonne vieille routine (boucle sans fin type DO/LOOP) avec un pick du temp via la fonction Timer qui compte le nombre de secondes passées depuis minuit (attention aux changements de journées - a tester!) :
tempsPresent = Timer
If tempsPresent => tempsPasse + 2 secondes Alors...
Tout le problème est d'avoir une gestion des millisecondes que seul le contrôle Timer te permet.
Mais un bon conseil mon gaillard... Met en place un système d'anti-récursivité :
Public varAntiRecursif As Bool
Private Sub Form_Load (...)
...
varAntiRecursif = True
...
End Sub
Private Sub ToutesLesFonctions
If varAntiRecursif = True Then Exit Sub
varAntiRecursif = True
... If Sortir True Then varAntiRecursif False : Exit Sub
...
varAntiRecursif = False
End Sub
Mais ça c'est à faire que tu utilises ou non un Timer car la récursivité est monnaie courrante lors de l'implémentation de l'interactivité des contrôles intrinsèques (p.ex. pour incrémenter/décrémenter des valeurs dans plusieurs TextBoxs via les touches Up/Down qui interagissent entre-eux...)
Bon, j'espère que tout ceci t'aide... Sinon, en cas de besoin : scsami @ yahoo . fr mais je te promet pas une réponse rapide!
Enjoy
<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )