Forum

Catégorie : Programmes
Forum : Aide à la programmation
Vues : 671
Réponses : 3
Type : discussion
Etat : réponses autorisées

Problème avec la reprise d'une boucle

thomas le 13/12/2013 à 21:47
Bonsoir, je code actuellement un PONG et le problème auquel je me heurte est le suivant: je dois gérer les getkey pour déplacer la raquette avec des boucles while et en meme temps faire déplacer la balle en permanence ce qui donne quelque chose comme ça.
Code
Texte en sous-format code
:While 1
:getkey->K
output(X,Y,"°"
While K=0
getkey->K
End
If K=26
Then
L+1->L
End
...
End


jusque là tout va bien le seul problème c'est que la balle ne bouge pas il faut appuyer sur une touche pour que la balle bouge
ce qui rend le jeu impossible.
quelqu'un a t il déjà eu ce soucis et a une éventuelle solution?
linkakro le 13/12/2013 à 23:03
Oui, d'autant que c'est un classique indémodable.

Tu dois sauvegarder la direction dans d'autres variables que celle de la saisie, les mettre à jour avec K et les utiliser à chaque tour de boucle pour effectuer le déplacement.

Tu n'as pas besoin de Then et End quand il y a une seule action.

Le plus simple pour y parvenir est de stocker des variables de Pas +1/-1 qui seront ajoûtées aux coordonnées régulièrement.
Et utiliser K lorsqu'il est non-nul pour modifier les Pas.
Code
5->X
5->Y
0->A
0->B
While 1
getkey->K
output(Y,X,"°
// actualisation des pas
If K=26
1->A
If K=24
-1->A
If K=25
-1->B
If K=34
1->B
// déplacement, et sécurité pour ne pas sortir de l'écran
// test de sécurité : If X+A<16 and X+A>1
X+A->X
// test de sécurité : If Y+B<8 and Y+B>1
Y+B->Y
End
On peut aussi stocker K dans une variable et déterminer les pas à chaque fois comme si c'était K.
Code
5->X
5->Y
0->M
While 1
getkey->K
output(Y,X,"°
// actualisation de la direction
If K   // revient à dire K non nul
K->M
// déplacement, et sécurité pour ne pas sortir de l'écran
If M=24    // et en plus: and X+A>1
X-1->X
If M=26    // et en plus: and X+1<16
X+1->X
If M=25    // et en plus: and Y-1>1
Y-1->Y
If M=34    // et en plus: and Y+1<8
Y+1->Y
End
Et il existe diverses manières d'optimiser. Je peux en indiquer certaines si on me demande, je ne veux pas embrouiller pour rien.

Toutes les choses basiques que j'utilise, mentionne, et tout simplement ce que tu veux faire ici, est traité dans des tutoriels. En particulier celui de Mdr1 sur OpenClassrooms.
https://web.archive.org/web/20[...]mer-en-ti-basic
Et puis la section article du forum contient des choses en plus.

Je rappelle que le nouveau forum Tout82.forumactif.org est disponible et contient quelques ressources plus à jour que le forum original ici présent.
thomas le 14/12/2013 à 08:44
tu veux dire que je devrai mettre If K=26 dans la boucle while 1 et supprimer la boucle while K=0 ??
linkakro le 14/12/2013 à 10:36
Presque.
Tu dois utiliser autre chose que K=26 pour maintenir le déplacement, par exemple M=26.
J'ai déjà donné deux exemples.
Tout cela revient à créer une mémoire de la dernière commande de direction puis effectuer le déplacement en fonction de la mémoire.

ERRATUM: j'ai mal écrit une ligne dans le second exemple que je corrigerai immédiatement : If L=34Y+1<8
Je change le nom de L en M pour éviter une quelconque confusion entre ton exemple et le mien.
Je place les tests de sortie d'écran en commentaire.

Si tu tiens à empêcher des actions si aucune touche n'est pressée, alors tu peux placer une boucle "Repeat K" autour des actions systématiques (celles qui sont effectuées à chaque tour), et du getKey ; puis placer en dehors de ce repeat ce qui dépend d'une pression de touche.