Page 1 of 2

Utilisation getkey

Unread postPosted: 06 Aug 2015, 08:12
by Lu_Lu54
Salut à tous je me suis mis au ti basic z80, et je me suis dit que ce serait formateur de faire un petit jeu pas trop dur : l'indémodable snake
J'ai décidé de faire mon serpent affiché avec des 0 qui se font outputer à la chaîne.
Je viens tout juste de commencer donc j'ai un problème vraiment basique

Je suppose que le code parle mieux que les mots, donc voici ce que théoriquement je voudrais faire :
Code: Select all
3->Y
5->X

Lbl R
While getKey=0 or getKey 84 or getKey=82
X+1->X
Output(Y,X,"O")
End
If getKey=73
Then
Goto U
If getKey=93
Then
Goto D
End

Donc basiquement ce bout de code est l'un des 4 qu'il y a pour les 4 directions.
Je voudrais qu'en sortant de la boucle while(si aucune touche n'est appuyée ou si le 4 ou le 6 est appuyé)
Le test if trouve ce qui a fait disjoncter la boucle, pour re guider vers une autre direction.
Seulement je pense que le getKey change trop rapidement, surtout que dans ma boucle while, j'ai inséré un timer (boucle while plus i qui augmente)

Je me demandais comment on pouvait récupérer cette info.
Est-ce qu'une variable qui prend la valeur du getKey à chaque tour marcherait ?

Merci ! :D

P.S.
Je suis pas venu lancer un débat sur l'optimisation ni les labels, que par ailleurs je trouve très pratiques :troll:

Re: Utilisation getkey

Unread postPosted: 06 Aug 2015, 10:38
by Wistaro
Plutôt que de partir sur 36 000 labels, pourquoi ne pas tout gérer dans ta boucle principale ?

Code: Select all
3->Y
5->X

Lbl R
Repeat K = 45 //on reste dans la boucle principale tant que l'utilisateur ne va pas sur clear pour quitter le jeu

GetKey->K //on stocke la valeur du getKey dans notre variable K

X+1->X
Output(Y,X,"O")
End
If getKey=73
Then
//On fait un truck
If getKey=93
Then
//On fait un truck
End

End


Le problème ici c'est que la valeur du GetKey va de suite se réinitialiser lorsque l'utilisateur va appuyer sur rien du tout. Il faut donc fais en sorte que:

Si K = machin ALORS I = truck
Si I = truck alors on incrémente Y (par exemple). Avec ça, si K reviens de suite à 0, Y va toujours s'incrementer.

On peut donc faire comme ceci, par exemple :

M et N sont des variables permettant de soit incrémenter X, soit Y. Ainsi:

M =1 --> On incrémente X de 1
M = 0 --> On incrémente X de -1 (on décrémente quoi)
N =1 --> On incrémente Y de 1
N = 0 --> On incrémente Y de -1 (on décrémente quoi)

Ce qui donnerais quelque chose comme:
Code: Select all
3->Y
5->X

1-> M
1-> N

Lbl R
Repeat K = 45 //on reste dans la boucle principale tant que l'utilisateur ne va pas sur clear pour quitter le jeu

GetKey->K //on stocke la valeur du getKey dans notre variable K

If M = 1: X +1->X
If M = 0: X -1->X
If N = 1: Y+1->Y
If N = 0: Y-1->Y

Output(Y,X,"O")

End
If getKey=73
Then
1-> M //par exemple hein!
If getKey=93
Then
1->N
End

End


On peux optimiser un peu optimiser ceci, pour faire plus beau et plus propre :

Code: Select all
3->Y
5->X

0 -> M
1-> N

Lbl R
Repeat K = 45 //on reste dans la boucle principale tant que l'utilisateur ne va pas sur clear pour quitter le jeu

GetKey->K //on stocke la valeur du getKey dans notre variable K

X + (M =1) - (not(M -> X
Y + (N =1) - (not(N -> Y

Output(Y,X,"O")

End

If getKey=73: 1-> M
If getKey=93: 1-> N



End

Re: Utilisation getkey

Unread postPosted: 07 Aug 2015, 08:09
by Lu_Lu54
Merci pour cette réponse super complète !

Je vais laisser de côté l'optimisation pour l'instant, mais par contre je n'ai pas trop compris ce que les deux points sont censés faire, c'est un then ?

Code: Select all
If M = 1: X +1->X
If M = 0: X -1->X
If N = 1: Y+1->Y
If N = 0: Y-1->Yx


Sinon je comprends le principe du m et n, ça permet de chopper la valeur de getKey avant qu'elle change c'est ça ?

Re: Utilisation getkey

Unread postPosted: 07 Aug 2015, 16:25
by Wistaro
En gros, quand ton IF ne s'applique qu'à une seule chose, le THEN et le END sont facultatifs.
Donc ceci
Code: Select all
If A = 37
Then
Goto Q
End


Peut se simplifier en:
Code: Select all
If A = 37: Goto Q


Avec le Delvar, c'est particulier. Déjà, tu sais qu'il peut se simplifier:

Code: Select all
Delvar A
4->B


Peut devenir:
Code: Select all
Delvar A4->B


Attention si le delvar est suivi d'un while ou d'un repeat, tu peux avoir des problèmes

Dans un if, le delvar suivit d'une autre requête passe aussi. Donc
Code: Select all
If A = 37
Then
Delvar A
Goto Q
End


Va devenir :
Code: Select all
If A=37: Delvar AGoto Q



Pour le M et N, c'est tout à fait ça. C'est une sorte de mémoire tampon; ce sont des variables tampons.

Re: Utilisation getkey

Unread postPosted: 09 Aug 2015, 19:28
by Epharius
Je voudrais juste proposer une amélioration. Personnellement j'aurais plutôt fait :
Code: Select all
If k=37
Delvar T1->S
If k=73
Delvar T-1->S
ETC...
Y+S->Y
X+T->X

Je pense que ça peut alléger le code...

Re: Utilisation getkey

Unread postPosted: 09 Aug 2015, 21:15
by Wistaro
Epharius wrote:Je voudrais juste proposer une amélioration. Personnellement j'aurais plutôt fait :
Code: Select all
If k=37
Delvar T1->S
If k=73
Delvar T-1->S
ETC...
Y+S->Y
X+T->X

Je pense que ça peut alléger le code...


Probablement ;) Je suis même certain qu'en cherchant bien, on peut faire mieux ^^

Re: Utilisation getkey

Unread postPosted: 10 Aug 2015, 21:29
by Epharius
Ouais y a toujours mieux :p
D'ailleurs faut bien penser à remplacer le k=37 par le bon code de la touche (pareil pour le 73).

Ah et pour aller encore plus vite quand on ne tourne pas (les 4/5 du temps) on peut mettre un if k juste avant le code des touches. M'enfin après c'est à considérer...

Re: Utilisation getkey

Unread postPosted: 30 Aug 2015, 19:31
by Lu_Lu54
re après une bonne absence :\

j'ai testé ton truc Wistaro et ça marche pas, je me retrouve avec le même problème, getkey reprend la valeur 0.

j'ai du coup fait un tour dans l'index que m'avait recommandé je ne sais plus qui qui décris getkey comme une variable dont la valeur " is cleared every time you read from it, until a new key is pressed"
donc ça veut dire que tant que je n'y touche pas, elle bouge pas, c'est ça ? et ça veut dire que normalement, si je la stocke dans une variable dès que la touche a été pressée, je la récupère...
sauf que je n'ai jamais réussi à ce faire :(

alors est-ce que ce serait différent à cause du fait que je travaille sur une ti83PCE?

Re: Utilisation getkey

Unread postPosted: 30 Aug 2015, 19:33
by Epharius
Oui c'est tout à fait ça, à chaque fois que tu fais getkey->K, si aucune touche n'a été pressée, K=0. Du coup, il faut d'abord mettre k dans une variable qui ne changera pas.

Re: Utilisation getkey

Unread postPosted: 30 Aug 2015, 19:34
by Lu_Lu54
dsl j'avais envoyé par erreur sans finir