Forum

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

Comment déplacer un objet ou une image avec des touches?

Jori le 12/10/2008 à 00:25
Bonjour, c'est encore moi!
Je débute en programmation, j'ai reçu ma calcullette avant-hier et j'arrête pas de la trafiquer ^^ .
J'ai une TI-82 stats.fr

Bon, je m'explique :

J'ai crée une image avec toutes les options de dessins et je l'ai enregistrée.
Je l'ai rapellée ensuite vers mon programme en fesant :

Code
:EffDessin
:RappelImage Img1


L'image s'affiche correctement, mais j'aimerai pouvoir la déplacer avec les flèches ou avec les touches 4 et 6 par exemple, comme un mini-jeu très simple.

Est-ce possible ?
Si oui, comment ?
coc5 le 12/10/2008 à 00:32
Désolé de te décevoir mais l'image enregistrée s'affiche en entier et ne peut donc être placer à un endroit ou un autre.
Ca aurait été trop beau eyeonly.gif
Jori le 12/10/2008 à 00:38
Ah, et comment je pourrais faire quelque chose qui se déplace alors ?

Imaginons que je tape tout les pixels dans mon programme (oui, je suis assez fou pour faire ça ^^), est-ce qu'il y aurait moyen de fiare déplacer tout les pixels à la fois de 5 pixels vers la gauche par exemple.

Sinon par exemple pour les jeux simples du type snake ou autres, comment le serpent fait pour se "déplacer" ?

Moi je m'en fiche si je me sers pas de mon image en fait, j'aimerai juste savoir comment déplacer un objet ou quelque chsoe quoi.
coc5 le 12/10/2008 à 01:07
Et bien le "dessin" (serpent dans un snake par exemple) se déplace en fonction de variables (que tu peux faire modifier par le programme en fonction des touches appuyées).

Mais très vite ça devient lourd à gérer...
Jori le 12/10/2008 à 01:13
C'est à dire ?
Je ne comprends pas bien...

Tu peux détailler plus précisément comment ça marche ?
Ca ne me déranges pas que ça soit lourd, c'est juste manière de programmer comme ça quoi.

Et justement, comment le faire modifier par le programme en fonction des touches appuyées ?

Peus-tu détailler un peu tout plus précisément ?

Merci en tout cas !
Sangohan38 le 12/10/2008 à 12:36
Et bien en gros les variables ce sont des valeurs qui changent et en fonction de leur valeur, le programme va exécuter une commande précise.
Pour faire varier la variable, on peut soit créer une boucle, soit utiliser les touches ou mettre des valeurs précises dans cerains cas.

Pour modifier les coordonées du mot afficher, on écrit l'instruction en fonction des variables.
Par exemple Ouput(Y,X,"A" affiche un A sur l'écran mais si X ou Y varie, il ne s'affichera pas au même endroit.

Sangohan38
coc5 le 12/10/2008 à 13:23
Code
31->Y:47->X
Repeat K=22
getKey -> K

X + (K=26) - (K=24) -> X

Y + (K=34) - (K=25) -> Y

Text(Y,X,"0

End


Cet exemple de code affichera "0" au coordonnées X et Y. Attention dans ce cas comme dans pxl-On etc... les variables doivent être entières et ne pas indiquer un point hors de l'écran (0/94 et 0/62 (0/57 pour text)) !

getKey met la valeur de la touche appuyée dans la variable K. Le programme augmente ou diminue les variables de cooreonnées en fonction de la valeur de K (et donc de la touche pressée).
Jori le 12/10/2008 à 16:59
Aaaaah d'accord !

Super merci à vous deux !

Le seul petit problème, c'est que ma calculette est en français (Ti-82 stats.fr), donc je ne sais pas à quoi correspond la fonction getKey, j'ai regardé dans le catalogue et elle n'y est pas.

Il y a quand même quelques trucs que je ne comprends pas dans ton code (en plus c'est difficile sans l'avoir testé).

Je ne comprends pas ça :
Code
Repeat K=22


Que signifie le repeat, il sert à quoi ?
Et le 22 ici désigne la touche n°22 ou bien c'est une valeur ?

Et ça :
Code
X + (K=26) - (K=24) -> X

Y + (K=34) - (K=25) -> Y


Quelle est la valeur du déplacement à la fin quoi ?
K=34 est une touche, et non une valeur non ?

Bon en tout cas déjà un grand merci, ça m'avance vachement déjà dans mon programme, j'ai fait coordonner tout les points de mon dessin par rapport à un point X,Y et quand je change les valeurs ça marche bien.
Il ne me reste plus qu'a faire changer ces valeurs avec les touches, quand j'aurais la bonne fonction qui correspond à getKey et surtout que j'aurais compris comment ça marche ^^
Sangohan38 le 12/10/2008 à 17:10
Et bien si K=24 la calculette dit que c'est vrai donc considère comme un 1.
C'est pareil pour les autres en gros, si tu appuye sur la touche n°24 la calculette fera ces calculs:

Code
X+0-0->X
Y+1-0->Y


Sangohan38
Jori le 12/10/2008 à 17:49
Ah ouais, d'accord, je comprends.
Donc par exemple imaginons que je veuillels le faire déplacer de 5 pixels et pas de 1, j'ai juste à faire :
Code

X + (K=26)*5 - (K=24)*5 -> X

Y + (K=34)*5 - (K=25)*5 -> Y


C'est bien ça ?

Et encore et toujours merci ^^

PS : Aucun rapport, mais je n'arrive pas à me connecter, c'est pour ça que je suis en invité.
coc5 le 12/10/2008 à 18:07
C'est bien ça winkle.gif

Note que seuls les touches flèches et DEL dont répétitives (si tu reste appuyez sur le [5] pour bouger tu ne changeras de place qu'une fois, tandis que si la touche prévue est la flèche, tu continueras en boucle).
Jori le 12/10/2008 à 18:15
C'est re-moi, excusez moi pour le double post, mais je ne peux faire autrement.

Pour la boucle repeat tant que K=22 ça veut dire quoi en fait, K est égal à 22 si on tape sur la touche "mode [quitter]"
Ou alors est-ce que le script s'arrête au bout de 22 déplacements ?

Bref, à quoi sert cette boucle repeat et comment elle marche, s'il vous plait.
Jori le 12/10/2008 à 18:18
Mince, j'avais pas vu ton message avant de poster.

Merci pour l'info de la répétition, la touche del correspond-t-elle à la touche suppr sur la Ti stats fr ?

C'est bon à savoir tout ça, merci beaucoup !
Sangohan38 le 12/10/2008 à 18:28
La touche DEL correspond à la touche SUPPR sur la calculette française.

Sangohan38
Jori le 12/10/2008 à 18:45
Ok, merci !

J'ai quand même un problème, le code que tu m'as filé, coc5, je l'ai rentré dans am calculette avec la fonction codetouche (à la place de getKey comme ma calculette estg en français), et quand j'appuie sur les flèches du haut et de droite, ça dessine des pixels derrière le passage du 0, et les flèches bas et gauchent font uniquement déplacer le 0 et effacent ces pixels dessinés quand le 0 repasse dessus.

Comment ça se fait ?

Voici le code que j'ai tapé :
Code
31->Y:
47->X
Repeat K=22
codeTouche->K

X+(K=26)-(K=24)->X
Y+(K=34)-(K=25)->Y

Text(Y,X,"0

End
coc5 le 12/10/2008 à 19:22
C'est normal, c'était un code d'exemple ^^

Pour répondre à ta première question, La boucle se répète tant que l'utilisateur n'appuie pas sur la touche 22 soit la touche quit/mode.

Donc pour la trace c'est normal, mais il faut comprendre le fonctionnement de la commande texte pour cela -_-
Pour faire simple, en faisant texte(X,Y,"0 tu affiche cela sur l'écran :
0100
1010
1010
1010
0100


La calculatrice efface les pixels là où il y a 0 et les allument là où il y a 1.
Il arrive donc que les 0 effacent une partie des traces.

Pour éviter cel, c'est simple, tu sauvegardes les données X et Y ; il ne te reste plus qu'à effacer l'ancien 0 avant l'affichage du prochain !

Text(U,V," <- trois espaces
Jori le 12/10/2008 à 20:23
Oulalalala !
Ça se complique là !

Je n'ai pas bien compris, comment on "sauvegarde les données X et Y" ?
Et comment on "efface l'ancien 0 avant l'affichage du prochain" ?

J'ai compris le fonctionnement, mais pas comment on fait, et à la fin tu dis :
Text(U,V," <- trois espaces

Quoi trois espaces ?
A la place du 0 je met 3 espaces ?
coc5 le 12/10/2008 à 21:17
31->Y:______________________________//On initialise les variables X et Y.
47->X
Repeat_K=22__________________________//Le programme répetera ce qui va suivre (jusqu'au End ) jusqu'à ce que la touche pressée soit [MODE]
codeTouche->K________________________
X->U:Y->V____________________________//On enregister les variables avant leur changement.
X+(K=26)-(K=24)->X___________________//On modifie les variables en fonction des touches pressées.
Y+(K=34)-(K=25)->Y

Text(U,V," "_______________________//On efface l'endroit de l'écran ou est le "0".
Text(Y,X,"0__________________________//On affiche le "0" aux coordonnées Xet Y.

End__________________________________// Fin de la boucle.
Jori le 12/10/2008 à 22:33
Super Merci !

Ca marche bien !

Par contre quand je veux l'adapter à mon programme, y'a des bugs.
Je m'explique, en fait dans mon programme j'ai déssiné un monocycle avec tout les pixels, et les pixels sont tous reliés a un même pixels de coordonné X,Y.
Mes points sont de coordonnées X+1,Y-3 par exemple.


J'ai donc mis le code que tu m'as passé mais sans les U et V car je n'utilise pas de fonctions pour afficher du texte.

Mon problème est un peu le même que tout à l'heure, quand je déplace mon monocycle avec les flèches, il laisse du noir derrière lui, dans n'importe quelle direction qu'il aille.

Comment puis-je arranger ça ?
Je suppose que ça doit être dans le même style que le bug d'avant mais je sais pas trop comment m'y prendre.

Voici mon code simplifié là où il y a des dessins :

Code
:3->X
:44->Y

:Repeat K=22
:getKey->K

:X+(K=26)*5-(K=24)*5->X
:Y+(K=34)*5-(K=25)*5->Y

:Pt-On(X,Y)

:Line(Y+1,X,Y+5,X)
:Line(Y-2,X+1,Y+7,X+1)
//etc...

:End


Voilà, comment puis-je arranger mon bug ?
coc5 le 13/10/2008 à 00:09
*Attention ! Je vois que tu as utilisé des ligne( qui font parties (comme les Pts) des affichages RELATIFS (relatif au cadrage Xmin/Xmax/Ymin/Ymax).

*Les Pxl() et Text()sont des affichages ABSOLUS et mais ne peuvent prendre que des valeurs entières et dans l'écran (contrairement aux relatives qui ne buguent pas dans ces cas-là).

*Donc sinon c'est le même système : Ligne(X,Y,A,B) affiche et Ligne(X,Y,A,B,0) efface. Pt-On devient Pt-Off, Pxl-On Pxl-Off etc...

*Note : Pt-Change et pxl-change inversent le pixel visé (en font du négatif quoi).

*Au lieu de tout recopier tu peux fair un :


Code
EffDessin
0 -> X:0 -> Y
Repeat K=22
 For(I,0,1)
If I:Then
getKey -> K
X + (K=26) - (K=24) -> X
Y + (K=34) - (K=25) -> Y
End

*Tes Lignes* ex : Ligne(X,Y,X+1,Y+1,I)
End
Jori le 13/10/2008 à 14:45
Salut !

Merci, j'ai testé ça, mais le problème c'est que le curseur se déplace au lieu du monocycle.

De plus, je n'ai pas bien compris le système de ta boucle, peut-tu m'expliquer ?
Jori le 13/10/2008 à 17:49
Bon finalement j'ai réussi à adapter ton code.

Par contre, je ne comprends toujours pas comment marche ton code.
Surtout au niveau du if I et même du for .
Peut tu m'expliquer le fonctionnement ?

Sinon, voilà le code que j'ai mis, pour l'adapter sur mon programme (j'ai inversé Y et X au début et j'ai la flemme de tout réécrire) (J'ai réussi a mettre ma calculette en anglais pour pas avoir a tout retranscrire) :

Code
3->X
44->Y

Repeat K=22

For(I,0,1)
IF I
Then

getKey->K
Y+(K=26)*5-(K=24)*5->Y
X+(K=25)*5-(K=34)*5->X

End

Line(Y,X,Y+1,X+1,I)
*ETC...*

End
End *(j'ai rajouté un End parce que sinon la boucle repeat n'était pas fermée)*


Mon dessin ne se recopie pas à chaques déplacements, il s'efface bien, le seul gros problème est qu'il s'éface et se construit tout le temps, la boucle est sans fin, il doit y avoir une erreur de ma part.

Sinon peut-être pour que mon programme soit plus rapide il faudrait que je fasse tout les pixels du décor avec Pt-Change, mais je ne sais pas trop comment m'y prendre, tu pourrais m'expliquer (si tu sais bien sûr).
On m'as dit de faire avec des tables maisj e ne sais pas comment ça marche et comment m'y prendre, en core une fois.

En tout cas encore et toujours merci à vous !
coc5 le 13/10/2008 à 19:17
Pour faire simple la boucle for() permet de lire l'affichage des lignes d'abord en effaçant ( Quand I=0 ) et en réaffichant avec les nouvelles valeurs ( Quand I=1 ).
Pour éviter le "clignotement" du dessin, rajoute ce code avant le for() (après le Repeat)

Code

Repeat K:getKey->K:End


(ce code va attendre que l'utilisateur appuie sur un touche)

Et pense à enlever l'autre getKey->K dans le If !
Jori le 13/10/2008 à 20:29
Euh, ok pour le fonctionnement du for et du if, mais le truc c'est que j'ai rajouté ce que tu m'as dit, mais le bug c'est que le dessin s'affiche après qu'on ai appuyé sur une touche, et quand on veut le faire bouger par la suite, ça affiche le curseur et le dessin ne bouge pas.

Si au contraire j'enlève le end et que je le remet à la fin (pour que le repeat fonctionne jusqu'a la fin du code), l'image clignote, je la déplace un coup puis elle s'arrête de clignoter et si je rappuie sur une touche de déplacement le curseur apparait.

J'ai fait plusieur test mais je n'arrive toujours pas à résoudre le problème.
Setich le 05/11/2008 à 10:55
Bonjour
J'ai un problème avec le code touche .
J'ai suivi ce qu'il y a sur ce forum mais j'ai pas tout compris.
Quelqu'un pourrait m'expliquer comment l'utiliser .?
Merci d'avance
Setich le 08/11/2008 à 08:55
Je sais maintenant comment me servir du code touche godgrace.gif
mais je ne sais pas commet faire par exemple , un personnage
a la rpg maker ou genre pokemon deplaçable .
(Je pense qu'il faut faire ça par pixel )
non?
aidez-moi svp .
coc5 le 08/11/2008 à 11:36
Ca ne se fait pas comme ça. Il y a plusieurs trucs à savoir. Mais déjà pixels par pixels sera assez long, il faut mieux utiliser l'écran principal avec des Output(X,Y,"0".
Et tu fais bouger le perso en modifiant les variables X et Y selon le codetouche.
Setich le 08/11/2008 à 13:55
Le problème c'est que j'aimerais faire un personnage
du genre Pokémon , c'est pas possible alors .
Parceque je sais qu'avec output mon personnage ressemble
à 0 ou 1 ou L ou X ... .
Sangohan38 le 08/11/2008 à 17:25
C'est possible seulement, ce sera très long.
L'autre méthode, c'est d'utiliser l'assembleur.

Sangohan38
coc5 le 08/11/2008 à 23:56
C'est bien ça pour débuter en programmation eyeonly.gif
Setich le 10/11/2008 à 18:24
Qu'est-ce que c'est l'assembleur ?
Un language de programation ?
Si oui où peut-on l'apprendre ? (je parle d'un site)
Texte dans une autre taille
coc5 le 10/11/2008 à 18:27
C'était ironique, l'assembleur est un langage proche de la machine (proche du binaire). Déconseillé pour apprendre la programmation !
Le site du zéro en propose tout de même un début, et plein de sites proposent des petits boûts de conseils etc...