Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » Scrolling de matrice [résolu]
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Scrolling de matrice [résolu]

Posté le 26/01/2015 19:34

Salut à tous !

Je fait un petit jeu qui arrive bientot. Pour ce faire, j'avait besoin d'un "scrolling" de matrice. Je m'explique, il fallait que la case 2 remplace la 1, la 3 remplace la 2 etc jusqu'à la 17 qui remplace la 16. J'avait fait
de cette manière
Cliquer pour enrouler
For 1→A to 16//Les cases de la liste
For 1→P To 4//les 4 colonnes de la liste
Mat A[P,A+1]→Mat A[P,A]//On fait "scroller" les colonnes
Next
Next
. Mais c'est un chouilla lent et j'aimerai réduire la vitesse le plus possible.

Remiweb a mis en pièce jointe un petit exemple très bien commenté que je vous invite à aller voir en page 1.

Un énorme merci à toi !


1, 2 Suivante
Remiweb Hors ligne Membre de CreativeCalc Points: 1040 Défis: 32 Message

Citer : Posté le 26/01/2015 19:41 | #


Tu fais quel genre de scrolling, horizontal uniquement ?
Et cette matrice te sert pour la hitbox ?
Tweaks : ||||| ||||
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 26/01/2015 19:44 | #


Scrolling horizontal et oui c'est pour la hitbox
Remiweb Hors ligne Membre de CreativeCalc Points: 1040 Défis: 32 Message

Citer : Posté le 26/01/2015 19:50 | #


Alors je te déconseille de tourner la matrice à chaque déplacement.
Si j'étais toi je prendrais une variable (X) pour la position horizontale du joueur.
Ca donnerait quelque chose du genre (avec des valeurs à adapter à ton jeu) :
- pour l'affichage : Locate 1,1,StrRotate(Str 1,X)
- pour la hitbox ça serait Mat A[1,X]=...

Pour l'affichage ça évite d'avoir à modifier les Str à chaque déplacement, ça change seulement visuellement. Et pour la hitbox tu vas juste chercher la valeur qu'il te faut au bon endroit au lien de la faire tourner.

Le décor est censé tourner en boucle ou pas ? Sinon il faut faire légèrement différent pour la matrice.
Tweaks : ||||| ||||
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 26/01/2015 19:51 | #


Tu dois pouvoir utiliser une liste, avec Mat→List et List→Mat pour bouger les colonnes d'un coup. Dans le même ordre d'idée tu dois pouvoir copier toute la matrice sauf une colonne au bout dans une autre matrice. Je peux pas te donner d'exemple parce que je me souviens plus de la syntaxe mais l'idée est là...
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 26/01/2015 19:52 | #


Oui mais ça limite donc le nombre de colonne pouvant apparaître (j'y avais pensé). Aussi j'ai une petite astuce pour avoir un scrolling de str infini sans changer de str :P

Ajouté le 26/01/2015 à 19:53 :
@Lephe Copier toute la matrice serait géniale mais comment ?
Remiweb Hors ligne Membre de CreativeCalc Points: 1040 Défis: 32 Message

Citer : Posté le 26/01/2015 19:56 | #


Je comprends pas trop, tu fais quel genre des scrolling ? Avec un même bout de décor qui passe en boucle ou simplement un carte horizontale dans laquelle on va d'un bout à l'autre...
Tweaks : ||||| ||||
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 26/01/2015 19:59 | #


Un décor qui défile et on doit éviter des trucs qui popent au hasard et j'aurai besoin de la matrice pour savoir si une fois que ces trucs sont au niveau du perso ils le touchent ou pas

Ajouté le 26/01/2015 à 20:02 :
@Lephe on peut pas mettre une liste dans une colonne de matrice
Totoyo Hors ligne Membre d'honneur Points: 16093 Défis: 102 Message
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 26/01/2015 20:12 | #


Matt36230 a écrit :
@Lephe on peut pas mettre une liste dans une colonne de matrice

Je suppose que Totoyo vient de démontrer le contraire ?
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Remiweb Hors ligne Membre de CreativeCalc Points: 1040 Défis: 32 Message

Citer : Posté le 26/01/2015 20:16 | #


Peut-être ça :
For 1->K to 16
Mat->List(A,K+1) -> List K
Next
4->Dim list 17
List->Mat(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17)->Mat A

A tester, je ne sais pas si c'est plus rapide.
Tweaks : ||||| ||||
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 26/01/2015 20:20 | #


C'est ce à quoi je pensais. Pour la copie de matrice pas sûr que ce sois possible mais je vais voir vite fait quand même...

Ajouté le 26/01/2015 à 20:21 :
Avec Trn tu dois pouvoir faire une rotation de colonnes puis écraser celle de droite. Je me trompe ?
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Remiweb Hors ligne Membre de CreativeCalc Points: 1040 Défis: 32 Message

Citer : Posté le 26/01/2015 20:27 | #


Matt36230 a écrit :
Un décor qui défile et on doit éviter des trucs qui popent au hasard et j'aurai besoin de la matrice pour savoir si une fois que ces trucs sont au niveau du perso ils le touchent ou pas

Bon, l'idéal est de décaler les chaînes à chaque déplacement, mais pas la matrice (pour gagner du temps).
Le truc c'est que je peux difficilement expliquer...

En faite il faut remplacer la colonne inutile de la matrice (partie sortie de l'écran) par celle apparue.
Imaginons qu'au départ ta carte est faite de 4 colonnes 1 2 3 4 :
1 2 3 4
Au déplacement suivant 1 sort de l'écran et 5 apparait :
5 2 3 4
Au déplacement d'après c'est 2 qui sort et 6 qui arrive :
5 6 3 4
Etc... :
5 6 7 4
5 6 7 8
9 6 7 8
...

Donc tu n'as plus à tourner la matrice à chaque fois, juste mettre les nouveaux éléments dedans en écrasant les anciens.
Tu vois un peux ce que je veux dire ou pas ?

Le plus gros problème c'est de rajouter la nouvelle valeur au bon endroit, et d'aller rechercher les bonnes pour la hitbox. Il faut faire ça avec une variable qui augmente à chaque déplacement et avec la fonction MOD().
Sinon je peux te faire un petit programme de démo







Ajouté le 26/01/2015 à 20:48 :
Allez j’essaie de compléter :
Admettons qu'au début du scrolling tu aie une matrice déjà prête de 4*17 et que la position X de ton joueur vaille 1

A chaque déplacement :
- Tu ajoutes 1 à X
- Tu génères un nouveau bloc (de valeur A) pour la ligne 1 de ta matrice, qu'il faut placer dedans de cette manière :
A->Mat A[1,MOD (X-2,17)+1]
(à faire pour chaque ligne de ton décor, ça suit le schéma que j'ai mit au dessus)

Pour la hitbox ça dépend d'où est ton personnage, s'il est toujours à gauche de l'écran (colonne 1 de la matrice) par exemple et que tu veux tester le bloc devant lui se sera :
Mat A[ligne ou est le personnage,MOD(X,17)+1]=...
Tweaks : ||||| ||||
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 26/01/2015 20:49 | #


J'ai compris Remiweb mais cela ne fonctionnera pas :oops:. Totoyo j'essaie on verra ^^. Lephe c'est quoi ?

Ajouté le 26/01/2015 à 20:50 :
Rectification j'ai rien compris Remiweb

Ajouté le 26/01/2015 à 20:51 :
@Totoyo je peux pas choisir ou je mets cette liste
Remiweb Hors ligne Membre de CreativeCalc Points: 1040 Défis: 32 Message

Citer : Posté le 26/01/2015 20:53 | #


C'est ce que je craignais, mais je ne sais sincèrement pas comment expliquer
Le principe est le même que ce que tu voulais faire : virer la ligne la plus à gauche de la matrice et ajouter la nouvelle à droite.
Sauf que là on ne fait pas tourner la matrice d'un cran à chaque fois, on vire juste la colonne correspondant à la ligne la plus à gauche pour l'écraser par la nouvelle.
Tweaks : ||||| ||||
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 26/01/2015 20:55 | #


Matt36230 a écrit :
Lephe c'est quoi ?

Mon imagination qui me fait penser qu'en passant par la transposée on peut virer une colonne. Rien que t'aies pas besoin d'oublier.


Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 26/01/2015 20:55 | #


D'accord mais justement cela ne fonctionnera pas. Je m'explique, je veux ce scrolling pour justement mettre en mémoire l'emplacement des eclairs et quand ils avancent leur hitbox avance aussi car dès que de nouveaux éclairs sont apparus, si les anciens n'ont pas bouger dans la matrice, ils sont ecrasés par les nouveaux

Ajouté le 26/01/2015 à 20:56 :
Lephe Tu peux être plus clair stp ?
Remiweb Hors ligne Membre de CreativeCalc Points: 1040 Défis: 32 Message

Citer : Posté le 26/01/2015 20:58 | #


Sisi ça marche, j'ai bien comprit ce que tu veux faire.
Mais comment expliquer...
Tweaks : ||||| ||||
Lephenixnoir En ligne Administrateur Points: 24145 Défis: 170 Message

Citer : Posté le 26/01/2015 20:58 | #


Matt36230 a écrit :
Lephe Tu peux être plus clair stp ?

Oui, alors pour être plus clair j'ai écrit (et accessoirement pensé) une connerie.

Ça te paraît suffisamment clair comme ça ?

Sinon tu as testé avec les listes ?
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Remiweb Hors ligne Membre de CreativeCalc Points: 1040 Défis: 32 Message

Citer : Posté le 26/01/2015 21:27 | # | Fichier joint


Je t'ai fait un programme comme exemple (en fichier joint)
Il n'y a qu'une ligne et ça génère soit un bloc vide (tiret du bas) soit un bloc solide (carré noir).
Les blocs avancent comme tu veux le faire, si le joueur (J) tape un bloc solide qui est devant lui ça affiche "TOUCHE".
J'ai essayé de commenter les différentes parties, j'espère que tu arriveras à analyser et comprendre
Tweaks : ||||| ||||
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 26/01/2015 21:28 | #


@Remiweb : Un petit programme serait pas de refus stp

@Lephe : D'accord merci et les liste je ne peux pas les placer ou je veux
1, 2 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 94 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd