Poster un nouveau sujet Poster une réponse
Une version plus opti de Space Invaders ?
Auteur Message
raboulave



Autorisation : Membre
Nb de messages : 57
Inscrit le : Jeu 08 Oct 2009, 20:56
Posté le : Dim 16 Fév 2014, 16:48   Citer 

Bonjour tout le monde,
Ça faisait longtemps que j'étais pas venu dis donc happy.gif

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 tongue.gif ), 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,"



 Adresse email Haut de page Bas de page 
 
m@thieu41



Autorisation : Membre
Nb de messages : 856
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Dim 16 Fév 2014, 22:54   Citer 

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/t50-candide-ou-l-optimisation

----------------------
Pour vous aidez dans vos débuts (et même ensuite ^^) :
*Tuto Algo->Ti Basic (par Linkakro) : Traduisez vos algo (de type algobox) en prgm pour votre TI!
*Catalogue des emplacements et traductions (anglais/français) des fonctions sur la TI.
*Faites vos propres programmes de maths (par ash)

Et au fait: la politesse n'a jamais tué personne winkle.gif
 Adresse email Haut de page Bas de page 
 
raboulave



Autorisation : Membre
Nb de messages : 57
Inscrit le : Jeu 08 Oct 2009, 20:56
Posté le : Mer 19 Fév 2014, 23:02   Citer 

Ok super merci je teste ça dès que je peux et je reposte happy.gif

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 ?

 Adresse email Haut de page Bas de page 
 
R0cks1



Autorisation : Membre
Nb de messages : 18
Inscrit le : Mar 04 Nov 2014, 19:17
Posté le : Sam 21 Fév 2015, 17:19   Citer 


Citer : raboulave
Ok super merci je teste ça dès que je peux et je reposte happy.gif

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

mon blog : http://duke-nukem14.skyrock.com/
 Adresse email Haut de page Bas de page 
 
Paolo972



Autorisation : Membre
Nb de messages : 14
Inscrit le : Dim 11 Jan 2015, 17:13
Posté le : Dim 22 Fév 2015, 21:54   Citer 

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 happy.gif )


Code
If L2(A
L1(A)-1->L1(A
Else
8->L1(A)
0->L2(A)



 Adresse email Haut de page Bas de page 
 
R0cks1



Autorisation : Membre
Nb de messages : 18
Inscrit le : Mar 04 Nov 2014, 19:17
Posté le : Sam 28 Fév 2015, 22:55   Citer 

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 ! cupsmiley.gif sinon ben j'irais pleurer dans un coin cry.gif

----------------------
signature classique : Geek un jour , Geek toujours

mon blog : http://duke-nukem14.skyrock.com/
 Adresse email Haut de page Bas de page 
 
Poster un nouveau sujet Poster une réponse





  Powered by Fire-Soft-Board v1.0.10 © 2004 - 2024 Groupe FSB
Page générée en 9 requêtes
BlackOne par Grimmlink