raboulave le 16/02/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,"
m@thieu41 le 16/02/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).
Ensuite lis ce tuto sur l'optimisation, il y a certaines choses qui peuvent te faire gagner en performance:
http://tout82.forumactif.org/t[...]-l-optimisation raboulave le 19/02/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 ?