Autorisation : Membre
Nb de messages : 57
Inscrit le : Jeu 08 Oct 2009, 20:56
Posté le : Dim 16 Fév 2014, 16:48
Bonjour tout le monde,
Ça faisait longtemps que j'étais pas venu dis donc
Bref, j'ai maintenant pas mal d'expérience en prog derrière moi, et je me remets cet aprèm à la TI pour coder un Space Invaders. (C'est bien elle est cool ma vie)
Tout fonctionnait bien jusqu'à ce que je me rende compte que je peux tirer qu'une boulette à la fois.
Alors j'ai peut-être loupé un truc gros comme une maison, mais il me semble qu'il n'y ait pas de moyen simple de faire ça sans utiliser un EffEcr à chaque tour de boucle.
Vu que je ne veux pas le scintillement dégueu, j'utilise la technique d'effacement de trace, sauf que pour ça il me faut plusieurs variables par boulette : sa position en x, en y, et son ancienne position en x pour l'effacement de trace. (Sa position en Y ne varie pas puisque on tire en vertical depuis le bas de l'écran).
J'ai donc pensé à une matrice. Le tout tourne bien, mais ça rame horriblement. Je vous demande donc si vous auriez pas une idée de comment faire mieux.
N.B : Pour les explications qui vont suivre je précise que j'imagine mon repère comme ceci :
X/Y--->
|
|
v
Donc, la matrice, chaque ligne correspond à une boulette, on peut donc tirer un max. de 3 boulettes, le premier chiffre correspond à sa position en X actuelle, le second chiffre à son ancienne position en X (je pourrais l'enlever et mettre X-1 partout dans le code éventuellement mais je doute que ça change grand-chose), le troisième chiffre correspond à sa position en Y, qui est la position du joueur au moment où il tire (on doit le stocker pour chaque boulette c'est atroce, si y'a mieux je suis preneur), le quatrième chiffre est en fait un booléen qui vaut 0 ou 1 selon que la boulette est physiquement présente à l'écran ou non.
(Lorsque je tire, je vérifie si la première boulette existe déjà, dans ce cas je génère la deuxième, si la deuxième existe déjà je génère la troisième, c'est pas super opti mais ça a le mérite d'être clair)
Pour les variables, je me sers de A pour mes For, ma matrice s'appelle également A (mais bon pas trop de confusion puisque la matrice est entre crochets et j'ai la flemme de tout remplacer ), Y et X sont les coordonnées du joueur, K stocke le getKey, B est l'ancienne position du joueur en Y (son X ne varie jamais il ne se déplace qu'horizontalement).
Je mets le code pour une Stats.fr et j'indente pour qu'on voie mieux les débuts et fins de blocs, et je commente le code avec // (pour les débutants qui voudraient recopier, // et ce qu'il y a après ne sera donc pas à mettre dans le code ^^) :
Code
EffEcr
8->Y
[[Y,0,0,0][Y,0,0,0][Y,0,0,0]]->[A]
8->X
Repeat K = 45 // Appuyer sur Annul pour quitter
codeTouche->K
Y->B
For(A,1,3)
[A](A,1)->[A](A,2) // On stocke les coordonnées de chaque boulette en tant qu'"anciennes coordonnées", pour pouvoir effacer derrière
End
Y-(K=24 et Y>1)->Y // Déplacements du joueur
Y+(K=26 et Y<16)->Y
If K = 21 // Touche 2nde pour tirer !
Then
If [A](2,4)=1 // Si la deuxième boulette est tirée alors il faut afficher la troisième boulette (et la deuxième boulette ne se tire que s'il y a déjà la première boulette à l'écran)
Then
1->[A](3,4)
Y->[A](3,3)
End
If [A](1,4)=1 // Je laisse =1 pour que ce soit plus explicite même si je pourrais l'enlever
Then
1->[A](2,4)
Y->[A](2,3)
End
If [A](1,4)=0 // La première boulette !
Then
1->[A](1,4)
Y->[A](1,3)
End
End
For(A,1,3)
If [A](A,4)=1:[A](A,1)-1->[A](A,1) // On fait avancer toutes les boulettes vers le haut si elles existent sur l'écran
If [A](A,1)=0 // SI les boulettes sont arrivées en haut de l'écran, on les "supprime" : on réinitialise leurs coordonnées et on dit qu'elles n'ont pas été tirées (pas besoin de réinitialiser le champ 2, l'ancienne coordonnée, ni le champ 3, la position Y du joueur quand il a tiré la boulette, puisque ces champs sont toujours recalculés)
Then
8->[A](A,1)
0->[A](A,4)
End
End
Output(X,Y,"+")
If Y!=B:Output(X,B," ") // != signifie différent de, et entre les guillemets il y a bien un espace ! Je n'efface derrière le joueur que s'il a bougé
For(A,1,3)
If [A](A,4)=1:Output([A](A,1),[A](A,3),"^") // Affichage des boulettes, chacune à ses coordonnées
If [A](A,1)!=[A](A,2):Output([A](A,2),[A](A,3)," ") // On efface derrière chaque boulette
End
End
EffEcr
Output(1,1,"
Autorisation : Membre
Nb de messages : 856
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Dim 16 Fév 2014, 22:54
Bonjour,
Je pense qu'une liste est tout aussi appropriée qu'une matrice, et permettrai d'optimiser un peu la vitesse.
De plus, pas besoin de stocker toutes ces données. Je m'explique:
Dans la première liste tu stockes juste la coordonnée X actuelle pour chaque boulette.
Donc tu prends une liste L1 de dimension 3 par exemple (premier terme: première boulette, deuxième terme deuxième boulette...)
Dans une seconde liste tu stockes la position en Y
Ensuite:
Pour déplacer les boulettes, il suffit d'ajouter 1 à la liste:
1+L1->L1
Puis, pour l'affichage, tu fais une boucle For tournant 3 fois, et pour chaque boulette, si elle est encore dans l'écran tu l'affiche, et à moins qu'elle soit sortie de l'écran avant tu l'effaces.
Lorsque tu veux tirer une nouvelle boulette, il suffit de tester si les autres boulettes sont ou pas sur l'écran, et les remplacer si elles ni sont pas (une variable à 0 au début, une autre qui tourne 3 fois, la première prend la position de la boulette qui peut être supprimée).
Autorisation : Membre
Nb de messages : 57
Inscrit le : Jeu 08 Oct 2009, 20:56
Posté le : Mer 19 Fév 2014, 23:02
Ok super merci je teste ça dès que je peux et je reposte
EDIT : Je ne sais pas ce que tu as voulu dire par 1+L1->L1, c'est un peu plus compliqué chez moi, je fais ça seulement si la boulette est sur l'écran et c'est une soustraction que je fais.
J'ai lu ton lien vers l'Optimisation et c'est vachement intéressant. Du coup j'ai modifié plein de trucs et j'ai perdu 1/7 de poids.
Voilà le nouveau code. J'avais créé mes propres noms de liste mais j'ai juste la flemme de les réécrire à chaque fois. Il vaut mieux créer ses propres listes ou utiliser les listes standard ?
Code
EffEcr
8->X:8->Y
suite(8,A,1,3->L1
suite(0,A,1,3->L2
Repeat K=45 // Touche Annul
codeTouche->K
Y->B
If max(K={24,26
Y-(K=24 et Y>1)+(K=26 et Y<16->Y
If K=21 // Touche 2nde pour tirer
Then
If non(L2(1 // Si la 1ère boulette n'est pas présente
Then
Y->L2(1
Else // Idem, pour la 2e
If non(L2(2
Then
Y->L2(2
Else // Idem, pour la 3e
Y->L2(3
End
End
End
For(A,1,3
If L2(A // Pour les boulettes présentes à l'écran
L1(A)-1->L1(A // On les fait monter d'un cran
If non(L1(A // Si la boulette a atteint le haut de l'écran, on la reset
Then
8->L1(A
0->L2(A
End
End
Output(X,Y,"+ // Affichage perso
If Y-B
Output(X,B," " // Affichage trace perso
For(A,1,3
If L2(A // On affiche les boulettes qui possèdent une ordonnée valable
Then
Output(L1(A),L2(A),"^
Output(L1(A)+1,L2(A)," "
End
End
End
EffEcr
Output(1,1,"
Par contre mes boulettes restent coincées en haut de l'écran.
Je commence à fatiguer nerveusement je vais essayer de régler ça demain !
Je n'ai juste pas fait ceci ->
"Lorsque tu veux tirer une nouvelle boulette, il suffit de tester si les autres boulettes sont ou pas sur l'écran, et les remplacer si elles ni sont pas (une variable à 0 au début, une autre qui tourne 3 fois, la première prend la position de la boulette qui peut être supprimée)."
Tu veux dire qu'à la place de mon gros bloc de If, Then, Else je pourrais avoir un For ?
Autorisation : Membre
Nb de messages : 18
Inscrit le : Mar 04 Nov 2014, 19:17
Posté le : Sam 21 Fév 2015, 17:19
Citer : raboulave
Ok super merci je teste ça dès que je peux et je reposte
EDIT : Je ne sais pas ce que tu as voulu dire par 1+L1->L1, c'est un peu plus compliqué chez moi, je fais ça seulement si la boulette est sur l'écran et c'est une soustraction que je fais.
J'ai lu ton lien vers l'Optimisation et c'est vachement intéressant. Du coup j'ai modifié plein de trucs et j'ai perdu 1/7 de poids.
Voilà le nouveau code. J'avais créé mes propres noms de liste mais j'ai juste la flemme de les réécrire à chaque fois. Il vaut mieux créer ses propres listes ou utiliser les listes standard ?
Code
EffEcr
8->X:8->Y
suite(8,A,1,3->L1
suite(0,A,1,3->L2
Repeat K=45 // Touche Annul
codeTouche->K
Y->B
If max(K={24,26
Y-(K=24 et Y>1)+(K=26 et Y<16->Y
If K=21 // Touche 2nde pour tirer
Then
If non(L2(1 // Si la 1ère boulette n'est pas présente
Then
Y->L2(1
Else // Idem, pour la 2e
If non(L2(2
Then
Y->L2(2
Else // Idem, pour la 3e
Y->L2(3
End
End
End
For(A,1,3
If L2(A // Pour les boulettes présentes à l'écran
L1(A)-1->L1(A // On les fait monter d'un cran
If non(L1(A // Si la boulette a atteint le haut de l'écran, on la reset
Then
8->L1(A
0->L2(A
End
End
Output(X,Y,"+ // Affichage perso
If Y-B
Output(X,B," " // Affichage trace perso
For(A,1,3
If L2(A // On affiche les boulettes qui possèdent une ordonnée valable
Then
Output(L1(A),L2(A),"^
Output(L1(A)+1,L2(A)," "
End
End
End
EffEcr
Output(1,1,"
Par contre mes boulettes restent coincées en haut de l'écran.
Je commence à fatiguer nerveusement je vais essayer de régler ça demain !
Je n'ai juste pas fait ceci ->
"Lorsque tu veux tirer une nouvelle boulette, il suffit de tester si les autres boulettes sont ou pas sur l'écran, et les remplacer si elles ni sont pas (une variable à 0 au début, une autre qui tourne 3 fois, la première prend la position de la boulette qui peut être supprimée)."
Tu veux dire qu'à la place de mon gros bloc de If, Then, Else je pourrais avoir un For ?
vraiment sympa ton programme mais j'ai un problème (peut être dût a une erreur de copie) OU QU'ILS SONT LES MECHANTS ???
et aussi j'ai remarqué un truc :
Code
If L2(A // Pour les boulettes présentes à l'écran
L1(A)-1->L1(A // On les fait monter d'un cran
If non(L1(A // Si la boulette a atteint le haut de l'écran, on la reset
Then
8->L1(A
0->L2(A
peut se transformer en
Code
If L2(A
L1(A)-1->L1(A
Else
8->L1(A)
0->L2(A)
A moins que j'ai aps compris ^^
---------------------- signature classique : Geek un jour , Geek toujours
Autorisation : Membre
Nb de messages : 14
Inscrit le : Dim 11 Jan 2015, 17:13
Posté le : Dim 22 Fév 2015, 21:54
Je crois que tu n'a pas compris :
Code
If L2(A // Pour les boulettes présentes à l'écran
L1(A)-1->L1(A // On les fait monter d'un cran
If non(L1(A YA MARQUÉ NON L1 et pas NON L2
Then
8->L1(A
0->L2(A
tu a confondu L1 et L2 ( L1 et Non L2 n'on aucun rapport a mon avis )
Autorisation : Membre
Nb de messages : 18
Inscrit le : Mar 04 Nov 2014, 19:17
Posté le : Sam 28 Fév 2015, 22:55
oui effectivement j'ai confondu L1 et L2 ^^ après c'est juste pour gagner un ou deux octets sur le programme , d'ailleurs si quelqu'un voudrait bien reprendre le développement de ce programme je serais ravi ! sinon ben j'irais pleurer dans un coin
---------------------- signature classique : Geek un jour , Geek toujours