Poster un nouveau sujet Poster une réponse
problème avec la reprise d'une boucle
Auteur Message
thomas
Invité
Posté le : Ven 13 Déc 2013, 21:47   Citer 

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?

  Haut de page Bas de page 
 
Google_AdSense



Publicité    



 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Ven 13 Déc 2013, 23:03   Citer 

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/20140901101450/https://fr.openclassrooms.com:443/informatique/cours/apprenez-a-programmer-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.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
thomas
Invité
Posté le : Sam 14 Déc 2013, 8:44   Citer 

tu veux dire que je devrai mettre If K=26 dans la boucle while 1 et supprimer la boucle while K=0 ??

  Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Sam 14 Déc 2013, 10:36   Citer 

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.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Poster un nouveau sujet Poster une réponse





  Page générée en 6 requêtes