Aller au menu - Aller au contenu

Icône Getkey

Avatar
Mise à jour : 22/08/2008
1 010 visites depuis 7 jours, dont 78 sur ce chapitre classé 126/786
Ce chapitre est vraiment très intéressant pour créer des mini-jeux puisque je vais vous apprendre à utiliser les touches de votre Ti. Vous pourrez donc utiliser la touche enter, les flèches,... pour interagir avec vos programmes

Génial, non ? :p
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Explication

Le principe est très simple ! :D
Il faut utiliser la fonction Getkey qui, à la pression d'une touche, va enregistrer un nombre correspondant à la touche enfoncée dans une variable.

Question n°1. Mais quelle valeur est enregistrée dans la variable ?

Un nombre compris entre 11 et 105. Ce schéma illustre bien la valeur de chaque touche de votre Ti. Vous pouvez remarquer qu'elle est organisée en lignes et en colonnes.
  • Les lignes sont numérotées de haut en bas. Elles vont de 1 à 10 et correspondent aux dizaines. (Les flèches haut, gauche, droite sont sur la ligne 2 & La flèche bas est sur la ligne 3.)
  • Les colonnes sont numérotées de gauche à droite. Elles vont de 1 à 5 (6 pour la flèche) et correspondent aux unités.

Image utilisateur

La Touche On n'a pas de valeur, car elle permet de sortir d'un programme à tout moment (bug, boucle infinie, ...) ^^


Question n°2. Comment utilise-t-on ce "Getkey" ?

Vous trouverez la fonction Getkey en faisant [PRGM]+ I/O + 7.
Ensuite, il vous faut choisir une variable dans laquelle vous allez stocker la valeur de Getkey. Tentez de garder toujours la même le long d'un programme, et de ne l'utiliser que pour ça. D'ailleurs, par habitude, je n'utilise que la variable K pour utiliser le Getkey.

Voici la syntaxe (on ne peut pas faire plus simple :D ) !
Code : Pascal
1
:getKey->K

A chaque fois que le programme rencontrera cette ligne, il enregistrera une valeur dans K, si une touche est enfoncée (ou 0, si rien n'est enfoncé). Ensuite, vous pouvez manier K comme n'importe quelle variable !

On utilise souvent les Getkey avec une boucle !
Code : Pascal
1
2
3
4
:Repeat K != 0 //(!= veut dire non égal)
:getKey->K
:End
:Disp K

Le programme attend la pression d'une touche pour ensuite donner sa valeur (utile non ? ^^ ).

La difficulté d'un Getkey est donc de bien le placer dans les différentes boucles de votre programme pour qu'il enregistre au bon moment la pression des touches. Mais je vous fais confiance ! ;)

Exemple : Déplacement

On ne va pas arrêter là ce tuto. Je vous propose un petit exercice que je vais vous commenter pas à pas. ^^

Grâce à ce que nous venons d'apprendre, je vais vous montrer comment déplacer un caractère sur l'écran texte, grâce aux flèches. (Essayez si vous le voulez une fois avant de regarder la correction.)

1er code



Tout d'abord, j'ai besoin d'effacer l'écran et d'initialiser mes variables. Je vais en avoir besoin de 3 pour le moment :
  • X : coordonnée du caractère sur la longueur
  • Y : coordonnée du caractère sur la largeur
  • K : le Getkey

Je dois aussi mettre en place la boucle dans laquelle va se dérouler le programme.
Mais passons au code !
Code : Pascal
1
2
3
4
5
6
:ClrHome
:1->X:1->Y
:Repeat K=105
:getKey->K
:
:End

Bien, pour le moment, le programme tourne jusqu'à ce qu'on appuie sur la touche Enter. C'est déja pas mal, mais on peut faire mieux ! :D

Affichage du caractère



Nous allons mettre en place l'affichage du caractère en utilisant... Output, bien sûr ! :p
Code : Pascal
1
:Output(Y,X,"+"

On va aussi rajouter les conditions pour déplacer le caractère.
Code : Pascal
1
2
3
4
:If K=24:X-1->X // à gauche
:If K=26:X+1->X // à droite
:If K=25:Y-1->Y // en haut
:If K=34:Y+1->Y // en bas


Ce qui nous donne :
Code : Pascal
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
:ClrHome
:1->X:1->Y
:Repeat K=105
:Output(Y,X,"+"
:getKey->K
:If K=24:X-1->X 
:If K=26:X+1->X 
:If K=25:Y-1->Y 
:If K=34:Y+1->Y 
:End


Gestion des collisions



Vous avez remarqué que si vous tentez de sortir de l'écran, vous avez simplement droit à un joli arrêt du programme. Il faut gérer ça en empêchant X et Y de dépasser certaines valeurs. Et on va le faire à grands renforts de If ! :D
Code : Pascal
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
:ClrHome
:1->X:1->Y
:Repeat K=105
:Output(Y,X,"+"
:getKey->K
:If K=24:X-1->X 
:If K=26:X+1->X 
:If K=25:Y-1->Y 
:If K=34:Y+1->Y 
:If X=0:1->X // le bord gauche
:If X=17:16->X // le bord droit
:If Y=0:1->Y // le bord du haut
:If Y=9:8->Y // le bord du bas
:End


Derniers bugs



Vous avez sûrement remarqué que le + laisse une grosse traînée derrière lui. :-°
On va s'occuper de ça ! :)

A chaque tour de boucle, on doit d'abord enregistrer les coordonnées X et Y avant de les modifier. On peut ainsi effacer leurs anciennes positions avant de les placer à leurs nouvelles. Pour cela, il nous faut 2 nouvelles variables. Pourquoi pas A et B ?

Code : Pascal
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
:ClrHome
:1->X:1->Y
:1->A:1->B
:Repeat K=105
:Output(A,B," " // il faut mettre un espace vide
:Output(Y,X,"+"
:Y->A:X->B      // on enregistre avant modification 
:getKey->K
:If K=24:X-1->X 
:If K=26:X+1->X 
:If K=25:Y-1->Y 
:If K=34:Y+1->Y 
:If X=0:1->X 
:If X=17:16->X 
:If Y=0:1->Y 
:If Y=9:8->Y 
:End

C'est magnifique ! Ça marche ! :D


Optimisation(s)



Je vais vous apprendre une astuce pour économiser quelques octets dans votre programme. On peut réduire la taille des conditions pour le déplacement. :)

De cela :
Code : Pascal
1
2
3
4
:If K=24:X-1->X 
:If K=26:X+1->X 
:If K=25:Y-1->Y 
:If K=34:Y+1->Y


On peut passer à ça : (les variables sont incrémentées ou décrémentées si la condition est vraie)
Code : Pascal
1
2
3
4
:X-(K=24->X 
:X+(K=26->X  
:Y-(K=25->Y 
:Y+(K=34->Y


Et même à ça : (en combinant deux conditions)
Code : Pascal
1
2
:X-(K=24)+(K=26)->X  
:Y-(K=25)+(K=34)->Y


Et voilà un programme, plus propre, plus léger, plus facile à comprendre.
Code : Pascal
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
:ClrHome
:1->X:1->Y
:1->A:1->B
:Repeat K=105
:Output(A,B," " 
:Output(Y,X,"+"
:Y->A:X->B      
:getKey->K
:X-(K=24)+(K=26)->X  
:Y-(K=25)+(K=34)->Y 
:If X=0:1->X 
:If X=17:16->X 
:If Y=0:1->Y 
:If Y=9:8->Y 
:End


Conclusion



J'espère que vous avez compris comment on se sert des Getkey .

Le programme qu'on a écrit est simple, mais à la base de beaucoup de jeux (vous retrouverez ce principe si vous faites un Snake).

J'ai aussi énoncé un principe important : l'optimisation.
Quand on a fini d'écrire un programme, l'important est de bien le relire pour voir si on ne peut pas faire plus simple, ou plus court à un endroit, utiliser moins de variables, ... Ainsi votre programme sera plus léger en place, plus rapide, plus simple à modifier ! Que des avantages, quoi ! :D
C'est tout ce que j'avais à dire sur ce chapitre ! :)
Chapitre précédent Sommaire Chapitre suivant

Partager

11 commentaires pour "Getkey"
Note moyenne : 3.82 / 4 (60 votes)
Pseudo Commentaire
Hors ligne 11TLP # Posté le 03/06/2007 à 02:58:53
i'm a fag, a 東方 fag
Avatar

Ville : Limoges
Pays : France métropolitaine
Études : Lycée Gay-Lussac - Limoges

c'est préférable d'utiliser ClrHome plutôt que de faire Output(A,B," ") et cela permet de ne pas utiliser les variables A et B :)

En train de développer un JV du type shoot'em up / jeu de cartes.

Pourquoi les Goto/Lbl en Ti-Basic c'est LE MAL ! (et partout d'ailleurs)
 
Hors ligne raboulave # Posté le 17/08/2009 à 00:33:12

Bon, les commentaires sur cette partie sont relativement vieux, et je me permets de faire un up dans l'espoir que quelqu'un me réponde : au risque de passer pour un noob, je voudrais savoir ce qui ne va pas dans mon code : le programme est une amélioration du tuto. J'ai essayé de faire du programme un jeu, où le principe serait qu'en une heure de cours, on se téléporte un maximum de fois pour avoir le meilleur score : en fait, à la manière d'un snake, le joueur doit se déplacer pour atteindre le téléporteur ( ici représenté par un point ) le plus de fois possible. Sans vouloir me vanter, je trouvais le concept addictif ( pas passionnant, mais quand il faut faire gaffe de pas se faire choper par le prof, ça devient plus stressant ^^ ) je mets donc le code :

Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
EffEcr
0->S
1->X:1->Y
1->A:1->B
Disp "ENTREE POUR COMMENCER LE JEU ET ENTREE POUR QUITTER LE JEU.
Pause
Lbl1
EffEcr
Repeat K=105
Output(A,B," "
Output(Y,X,"+"
entAleat(1,8->E
entAleat(1,16->F
Output(E,F,"."
Y->A:X->B
codeTouche->K
X-(K=24)+(K=26)->X
Y-(K=25)+(K=34)->Y
If X=0:1->X
If X=17:16->X
If Y=0:1->Y
If Y=9:8->Y
If Y=E et X=F
S->S+1
Goto1
If K=105
Disp S
Disp "POINTS"
Disp "FAITES ENTREE"
Pause
EffEcr
End
Output(1,1,""

"Heureux est l'étudiant qui, comme la tranquille rivière, suit toujours son cours sans jamais quitter son lit."
 
Hors ligne TimBuk # Posté le 28/01/2010 à 21:30:18
Make install not war
Avatar

Ville : Bordeaux
Pays : France métropolitaine

J'ai un ERROR:OVERFLOW avec le
Code : Pascal
1
2
3
4
Repeat K!=0
getKey K
End
Disp K

Image utilisateur
Puissance Shell, bibliothèque de codes sources de virologie.
 
Hors ligne totoducra # Posté le 27/12/2010 à 12:47:10

Ton tuto est vraiment très bien, mais il y a juste un petit problème...
Ma calculette scientifique est une casio et pas une texas instrument :euh: :(
 
Hors ligne Shinyuu # Posté le 02/02/2011 à 22:45:33

Bonjour à tous !
Alors comme l'as dit quelqu'un plus bas, et c'est pour ça que je me suis poussé à m'inscrire, c'est que d'abord le A et B alourdissent le code, mais aussi sont complétement inutile,

il suffit simplement de faire

Code : Pascal
1
2
3
4
5
:EffEcr
:1->X:1->Y
:repeat K=105
:EffEcr
:Output (X,Y, "+"


etc. etc..

raboulave ton problème est que tu as pas donné d'algorithme à ton résultat. Et aussi car C'est pas S qui devient s+1 mais l'inverse, donc

Code : Pascal
1
2
:If Y=E et X=F
:S->S+1


Ca doit être

Code : Pascal
1
2
3
4
:if Y=E et X=F
:Then
:s+1->s
:END



Petit Edit, ton code c'est vraiment le bordel en faite, j'avais pas fait gaffe au premier coup d'oeil mais rien n'est placé au bon endroit, me suis permis de le retaper, j'espère que tu m'en voudras pas.
Chez moi ça donne ça :

Code : Pascal
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Effecr
1->x:1->y
0->s
disp "clic sur entrer"
disp " pour commencer "
disp " puis entrer"
disp " pour "
disp " quitter le jeu"
lbl 1
effecr
entAléat(1,8)->E
entAléat(1,16)->F
Repeat T=105
Effecr
Output(X,Y,"+"
Output(E,F, "0" ( le 0 est plus classe que le . :D )
codetouche->T
Y-(T=24)+(T=26)->Y
X-(T=25)+(T=34)->X
If X=0:1->X
If X=17:16->X
If Y=0:1->Y
If Y=9:8->Y
if X=E et Y=F
Then
S+1->S
Goto 1
End
End
EffEcr
disp "Points: "
disp S
disp "1 Pour rejouer !"
Disp "2 Pour quitter !"
If T=92:goto 1
If T=93:goto 2
lbl 2
Disp "Fin"

Voir tous les commentaires