Piste de course

neodarkain Messages postés 4 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 13 décembre 2005 - 11 déc. 2005 à 02:21
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 - 13 déc. 2005 à 02:37
avertissement : vous répondez à quelqu'un qui fait du VB depuis moin de 2 semaines


En gros, j'ai du mal a progresser, je voudrais savoir quel serais le moyen le plus simple d'arriver à :

1- ce que la voiture puisse prendre de la vitesse, puis ralentir si on relâche "UP" , plutôt que de se déplacer de manière saccader.

2- s'assurer qu'on puisse tourner en même temp qu'on accélère/avance a vitesse constante, pluto que de devoir cessé de se déplacé pour changer de direction

3- comment, sur une image fixe, séparé certain région afin que la voiture s'arrête si elle frappe un mur pluto que de progresser normalement comme elle le fait sur le "bitume".

Je voudrais qu'une fois terminer, cela ai l'air de sa, en plus rudentaire s'est clair..
http://www.miniclip.com/minicliprally.htm

excepté que l'image de la piste est fixe et complêtement visible ( aucune caméra ) , on voit toute la piste dès le départ, et une voiture mignature la parcours qui se comporte sensiblement de la même fâcons, j'ai réussi à la fair tourner sur elle même, en faisant apparaitre 24 image différant de 15 degrée chacune.

Il serait p-t plus simple de vous montré ce quej'ai de fait mais bien que je sache qu'on puisse mettre son fichier directement ici, je ne sais pas comment.
merci

7 réponses

ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
11 déc. 2005 à 07:59
Heu salut, moi j'ai que 2 jours de VB (mais plus d'une dixaine de français !!!) et j'aimerais faire un FPS type Quake-like mais en vachement plus beau tu vois. Style avec des distortions spacio-temporelles en full réalistic 3D que même la X360 gère pas encore... Pi j'aimerais aussi l'interfacer en VR histoire de lui donner un ptit coté un peu hype tu vois...

Non, sérieux, si tu veux faire ce genres de niaiseries, fait du Flash et passe ton chemin !

Mais si tu veux quand même le faire en VB (pour on ne sait trop quelle raison stupide), fait-le en DirectX.

Sinon :
1) Il suffit de temporiser ta routine via, tout simplement, une bonne vieille boucle sans fin (d'où le terme "routine" ;-) du type Do/Loop [ou Label/Goto pour les oldschooleurs!]. Ensuite, une petit variable qui s'incrémente... puis se décrémente... tout simplement!!!

2) Là je te laisse te référer à la MSDN (l'aide du VB) et aux événements KeyDown et KeyPress ainsi qu'aux opérateurs AND et OR...

3) Si tu ne trouves pas une réponse... c'est que ta question n'est juste (basée sur une logique présumée correcte) ! Autrement dit, tu soulève la douloureuse question de la gestion des collisions. Question si fondamentale qu'elle oriente à elle seule tout l'approche du prog. Dans ton cas, il n'y a qu'une seule solution : oublier cette stupide idée de vouloir faire des jeux quand on s'y connait rien!
Parce que sinon, il y aurait bien une approche vectorielle, une autre matricielle pi, éventuellement, quelques alternatives mixant les deux!

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )
0
neodarkain Messages postés 4 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 13 décembre 2005
11 déc. 2005 à 14:52
Pour répondre à ta question sans être arrogant, c'est vrai que je n'y connais rien, et même que je n'y prend aucun plaisir, mais si je ne mène pas ce projet a terme, j'aurai à rependre ce cours qui ne se donne qu'à l'automne et devrai retarder d'un an mon entré a l'université parce que j'aurai couler le projet final. Oui je suis obliger de le fair en VB, voila, la raison stupide.
Je demande juste de l'aide a qui veut bien m'en donner, je me fais un plaisir d'aider les gens en générale, surtout quand c'est dans mon domain et j'en suis justement un peu trop éloigné avec ce projet.

Mon but n'était pas d'approndir une connaissance profonde en programamtion ou de satisfaire un désir ardent de concevoir un jeu arriéré basé sur quelque chose qui à déjà été fait à plusieurs reprise.

Mais merci je crois déjà que je vais pouvoir avancer avec sa, toute-fois, c'est un cours de base et avec les grève on a eu le temp que de voir la moitié de la matière, du coup, je peux pas le faire en direct X, non seulement parce que je l'ai pas vu mais surtout parce qu'on doit se débrouiller sans ça.

J'ai vu le programme d'un de qqn sur le site ( "voiture" source 22076 ) qui "gérait" les collision en crééant des mur avec des labels, suis-je obliger de le fair comme sa si je veux être en mesure de le fair seul ou, est-ce qu'il y'aurais moyen de le fair différemment, ( puisque j'ai déja une image piste de course avec des muret de différente couleur) soit en suposant que je puis imposer a la voiture de ne pas traverser une espace t'une tel couleur, ou juste en m'assurant de noter chak position et de les éliminé une a une si je m'assure que la piste est bien figé là ou elle est.

J'accepterai volontier toute forme d'éclaircissement.
0
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
11 déc. 2005 à 18:25
Merci d'avoir répondu à ma question inexistante
Je vais donc, à mon tour, répondre à la tienne - tout aussi inexistante soit dit en passant!

Pour commencer, déjà, il faudrait peut-être nous donner les termes de ton projet histoire de voir ce qu'ils te demandent !
Ensuite, sache que si tu "perds" une année scolaire, ce n'est pas la fin du monde (enfin, je crois).

Quant à DirectX, je me demande bien comment tu as fait pour le désinstallé puisque tu dis que tu ne l'as pas !!! Tu dois être farouche pour avoir fait ça!

Je rajouterais que toute la puissance du VB se trouve dans sa facilité de cablage des API tant de Windows que de DirectX. Autrement dit, utiliser VB sans utiliser des APIs est un peu... bête!
Autrement dit, aucun codeur, prof ou pas prof, ne peut justifier la non exploitation de ces techniques!
Bref... Comme tu dis, c'est un cour de base auquel tu dois répondre.
La question que je me demande c'est si le coup du "jeu de voiture" est une idée de toi ou celle de ton prof !?!?!? Parce que faire un jeu de voiture pour tester les bases du VB me parait très hasardeux!!! D'où l'importance de nous résumer le travail demandé par tes profs car un jeu de voiture n'est pas forcément visuel !!! On peut parfaitement faire un jeu de paris sur championnat!!!

Pour ton problème de clavier, il suffit de mixer (soit via AND soit via OR) les codes claviers des deux touches...
Private Sub KeyDown(KeyCode ...)
Select Case KeyCode
Case codeUP
'va en haut
Case codeUP AND codeLEFT
'va en haut à gauche
...
Case Else
...
End Select

Pour ton problème de collisions, il faudrait déjà que l'on puisse voir ta carte (la piste de course). Si, comme je l'imagine, elle fait le tour d'une marre centrale (ovale - style classique/patate), ce n'est pas pareil que si la piste est sans fin (style jeux électroniques - 3 voies). La technique vectorielle est la plus compliquée et te demandera bon nombre de calculs et donc, une certaine maitrise du VB.
La technique matricielle reste la meilleur coté rapport simplicité/efficacité mais demande quand même de bonnes connaissance et une parfaite maitrise des matrices (tableaux).
Reste encore une solution... La plus simple... mais la moins performante !!!
Si, comme tu le dit la piste ne change pas et est graphiquement rudimentaire, tu peux utiliser la méthode du pickpoint...

Autrement dit, afin de connaître l'emplacement de ta voiture il te suffit de récupérer la couleur d'un (ou de plusieurs [4 p.ex.]) pixels (point de couleur donc). Si ta piste est grise (RGB 128,128,128) et que l'exterieur est vert [de l'herbe] ou blanc [la bordure de la piste], il te sera simple d'interagir.
Tu peux utiliser soit l'instruction du VB, soit l'API Windows prévue à cette effet qui augmentera grandement la vitesse du tout :
Fonction VB :
varCouleur = Point(X,Y)
Couleur est en RGB (0-16'777'215) X et Y représentent les coordonnées du pixel à tester

Déclaration de l'API (a mettre telquelle dans l'entête de ton code) :

Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As Long, ByVal X AS Long, ByVal Y As Long) As Long

Cette API est viable pour le VB6... Pour le .Net c'est à vérifier!
Cette déclaration est issue de "l'API-Viewer" de www.AllAPI.Net, site de référencement des API Windows (si ton prof te demande!).

Ensuite, elle s'utilise presque de la même manière que Point (mais en beaucoup plus rapide!!!) :
varCouleur = GetPixel(machin.HDC, X, Y)
où "machin" est le nom, soit de ta PictureBox, soit de ta Fenêtre soit du contrôle sur lequel tu dessines. En fait, tu récupères sa propriété hdc qui est le "Handle". Autrement dit, en français, la poignée. En fait, c'est la référence mémoire de la partie graphique de ton contrôle...

Bref, une fois la couleur récupérée, il te suffit d'agir en conséquence. Note que tu as la fonction RGB(rouge 0-255, vert 0-255, bleu 0-255) pour travailler les couleur (mais ça, tu devrais normalement le savoir!).

Mais cette méthode n'est valable qu'a la seule condition que ta voiture soit placée dans un contrôle Image et non dessinée sur ta carte ! Ou alors il faut gruger et donc, bien s'y connaître !!!
Mais si c'est trop dur, tu peux toujours charger ta carte dans un PictureBox que tu cacheras lors du lancement du programme (Form_Load ... PictureBox1.Visible = False) et que tu utiliseras uniquement pour récupérer la couleur des points - a l'unique condition que tes deux maps soient parfaitement identiques!!!

Voilà, c'est tout ce que je peux te dire pour le moment!

Bonne chance.

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )
0
neodarkain Messages postés 4 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 13 décembre 2005
11 déc. 2005 à 19:41
http://www.collanaud.qc.ca/lass/tadm/lucboyer/pdf/TravailSessionKTC.pdf

Voila les conditions du travail. Tu auras tôt fait de comprendre que j'ai choisi l'option #1


La piste se trouve en bas, pour la voiture, cette une image dans u picture box appart, et jen ai 24 image, une pour chaque 15 degré différent, et juska maintenant jai réussi a la fair changer de de direction avec les flèche du clavier. Comme les couleurs vari (différents ton de gris etc..) je crois pas pouvoir faire sa de la première manière, a moin de créé une piste "invisible" de même dimension avec paint et de la juxtaposé par dessus mais qu'elle disparaisse a l'ouverture du programme mais donne quand même la trajectoire a suivre.

com sa:


If keycode = 37 Then
Auto.pPositionLeft = imgauto(Auto.pDirection).Left
Auto.pPositionTop = imgauto(Auto.pDirection).Top
imgauto(Auto.pDirection).Visible = False


' selon la formule qui nous assure de toujours avoir un résultat positif
' a mod b = b - 1 - (-a -1) mod b nous aurons :
'Auto.pDirection = (Auto.pDirection - 1) Mod 24
Auto.pDirection = (24 - 1 - (-1 * (Auto.pDirection - 1) - 1)) Mod 24

imgauto(Auto.pDirection).Left = Auto.pPositionLeft
imgauto(Auto.pDirection).Top = Auto.pPositionTop
imgauto(Auto.pDirection).Visible = True



End If


If keycode = 38 Then
'imgauto(0).Left = imgauto(Auto.pDirection).Left + (100 * Sin(Auto.pDirection * 15))
' x = CInt(Sin((Auto.pDirection * 15) * pi / 180))

imgauto(Auto.pDirection).Top = imgauto(Auto.pDirection).Top + 100 * CInt(Sin(Auto.pDirection * (15 * pi / 180)))
imgauto(Auto.pDirection).Left = imgauto(Auto.pDirection).Left + 100 * CInt(Cos(Auto.pDirection * (15 * pi / 180)))
end if

J'imagine que l'image d ela piste te donnera déja une idée de ce que je suis en train d'essayer de faire. La grille de départ c'est our la forme, c'est pas mentionné qu'il doit y avoir des concurrent. Aussi mes images de voiture sont vite fait, elles on toutes ( excepté les quatres rotation de base (90/180/270/360) un contour de la couleur de la piste que je n'ai pas été capable d'éliminer avec paint puisque l'image doit toujours être rectangulaire.
ex : etc...

merci encore, j'espère avoir été plus clair cette fois
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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 à 01:25
Déjà, pour commencer, voici quelques commentaires à faire à l'idiot qui a pondu le sujet du travail de session (Lucky Boyer) :
1+1+1 = "les deux travaux suivants", c'est bien ! Il a eu son diplôme dans un oeuf pouri ton prof ?
Si je comprend bien, le travail demandé est la programmation d'une piste de course... en Visual BASIC. Waip... Et Photoshop, c'est fait pour le calcul mental je suppose !?!?
"Le déroulement de la course devra être chronométré en temps réel et ainsi permettre par un affichage d’en suivre le déroulement." On doit afficher quoi exactement ??? Le déroulement du déroulement de l'affichage ou afficher le chronométrage du déroulement déroulé !?!? Non, sérieux, il aurait dû faire géométrie ton prof vu la symétrie de ses conneries !!!
"Toutes les données ci-dessus doiven
onfigurables par l’utilisateur en temps réel. Vous pourrez à votre guise paramétrer le tout et même
d’
enrichir votre programme avec d’autres options."
Putain, il a fait français en troisième langue!!!

"Le type RECORD doit être utilisé obligatoirement pour l’un ou l’autre des exercices" Dites, vous êtes certains de ne pas venir d'un retranchement spacio-temporel des années 80 !?!?!? Perso, je serais lui, j'imposerais l'utilisation des GOSUB/RETURN voire des GOTO !!!
"...votre projet compressé avec l’utilitaire WINZIP." Et si on utilise autre chose que cette grosse merde comme WinACE par exemple il se passera quoi ??? Dit, si vous vous laissez faire comme ça il va bientôt vous imposer d'acheter des softs ! N'empêche, en sens bien en lui le connaisseur !
"Vous devez obligatoirement utiliser
les retraits pour votre algorithme." Mort de rire!!! Le mec connaît même pas le mot "indentation" et il enseigne la programmation !!! Incroyable!
Bon, sinon, juste pour info, dit lui quand même que les bibliothèques ça existe et que dedans il trouvera des dictionnaires de traduction anglais-français... Ca lui évitera de dire des connerie comme "Formulaire" pour "Form" !!!
Encore que je crois sincèrement que la meilleur des choses serait de lui conseiller de retourner à l'école.
Bref...

Revenons-en à nos bubons... heu... nos boutons... non, attend, je vais y arriver... nos moutons
0
neodarkain Messages postés 4 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 13 décembre 2005
13 déc. 2005 à 01:39
Je ne vois pas en quoi je pourrais te contredire sur ces points....mais je ne crois pas que lui dire de retourner aux études sois, vraiment la solution.

Mais merci de tintéressé, si toi ou quiquonque avé toujours des suggestion, pour les collisions, jme servirai de labels et de leur positions pour empêcher la voiture de progresser, et j'abandonne mon image de piste . Quand i parle du déroulement, je crois qui parle d'une piste mignature qui montre la progression de ma voiture sur la piste, ce qui semble ridicul puisque toute la piste est visible mais il ne pouvais pas deviner que je le ferais ainsi, alors je le ferai aussi, ( pas comme dans mario kart 64, ou a plusieur on voit juste la progression en % sur une ligne droite, mais bien sur une piste réel mais mignature, ( radar) Et je suis pas encore arriver a donner une vitesse a la voiture, que je fait une boucle, do/loop, elle fait un bon fair linfini et je ne la revoi plus, et jai pas plus réussi a la fair tourné lorsque la flèche "UP" est enfoncé. Enfin pour les "laps" je ne crois pas qu'il y aura de problème.
0
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". )
0
Rejoignez-nous