Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » [Tutoriel] Le Multi DrawStat
NinestarsHors ligneMembrePoints: 2188 Défis: 22 Message

[Tutoriel] Le Multi DrawStat

Posté le 10/01/2016 19:23

Attention, ce tutoriel est complexe et se destine à ceux maîtrisant déjà le Super DrawStat.

Le Multi DrawStat n'est pas un remplacant du Super DrawStat, mais un nouvel outil de dessin ultra rapide en Basic.
Il n'est pas forcement plus rapide, mais offre une approche différente pour dessiner.
Il se base sur une nouvelle logique de dessin offrant d'autres possibilités.

Quelle est la différence avec le Super DrawStat ?
Au lieu d'avoir deux List qui enregistrent le sprite, on a maintenant deux expressions qui enregistrent la façon de dessiner le sprite.
La nuance peut paraitre floue, mais voyons cela tout de suite.


Initialisation :
On commence par initialiser le ViewWindow en rajoutant MIN, MAX, PAS.
ViewWindow 1,127,0,1,63,0,0,1,1
Cette fois, le paramètrage est fixe, c'est toujours le même.


Définition d'un sprite :
Pour définir un sprite, nous allons définir la "façon" dont la calculatrice va le dessiner.
Partons de cette exemple :

On le décompose naturellement comme celà :

On voudrait tracer un trait bleu, puis un trait orange, puis un point vert et un autre point jaune.
Commencons par le trait bleu d'origine (0;0). Il se prolonge de 4 vers la droite et 0 vers le haut.
Nous allons traduire cela par :
{0+4T}
{0+0T}

Le trait orange d'origine (3;2). Il se prolonge de 0 vers la droite et 2 vers le haut.
Nous allons traduire cela par :
{3+0T}
{2+2T}
Voilà, je pense que vous avez pigé le principe.

Pour les points c'est même chose mais avec une prolongation nulle
D'où pour le point vert
{0}
{3}

Et le point jaune
{5}
{3}



Utilisation :
Nous allons toujours utiliser la commande
Graph(X,Y)=(

Graph(X,Y) est une commande trouvable à l'adresse : SHIFT F4 F5 F3
En reprennant l'exemple du dessus nous allons écrire :
Graph(X,Y)=({0+4T, 3+0T, 0, 5}, {0+0T, 2+2T, 3, 3})

En simplifiant un peu
Graph(X,Y)=({4T,3,0,5}, {0,2+2T,3,3})

Entre les premières accolades {...} nous avons les coordonnées sur x de nos éléments à dessiner. Et entre les deuxièmes accolades, les coordonnées sur y.


Comment ça marche ? :
En fait Graph(X,Y) va lire la première valeur de chaque accolade pour T=0 puis pour T=1 (voilà la raison du paramètrage de ViewWindow) pour obtenir les coordonnées de deux points qui définissent le segment puis trace le trait entre les deux.
Ensuite Graph(X,Y) va lire la deuxième valeur de chaque accolade, et ainsi de suite.


Pour aller plus loin :
En réalité, on remarque que l'on utilise des structures entre accolade {...}, ce sont donc par nature des List.
Ainsi pour décaler notre sprite de (I;J) on peut faire des additions
64->I
32->J
Graph(X,Y)=( I+{4T,3,0,5}, J+{0,2+2T,3,3} )


Mais ? Tu viens de dire que ce sont des List, alors pourquoi on ferait pas
{4T,3,0,5}->List 1
{0,2+2T,3,3}->List 2
Graph(X,Y)=(List 1, List 2)

Le problème si on écrit {4T,3,0,5}->List 1 c'est que l'expression 4T va être calculée puis enregistrée dans List 1. Donc on perd l'expression dont a besoin Graph(X,Y) pour déterminer les deux points qui formeront le segment à tracer...
Par contre si nous avons que des points à tracer, et pas de traits (donc pas de T) , alors c'est possible.
{4,3,0,5}->List 1
{0,2,3,3}->List 2
Graph(X,Y)=(List 1, List 2)
Cette commande va simplement dessiner les points. On peut d'ailleurs optimiser en mettant MAX à 0 puisque T na pas besoin de changer.


Voyons un autre exemple : nous allons remplir l'écran en noir en 1,10s
ViewWindow 1,127,0,1,63,0,0,1,1
Seq(X,X,0,63,1)->List 1    // on fabrique la liste {0,1,2,...63}
                          // chaque ligne horizontale de l'écran
Graph(X,Y)=(127T,List 1)
Ici c'est un peu différent, on a pas d'accolades. Si on utilise des acolades, alors la fonction va aller lire terme par terme dans les acolades. Si il y n'y a pas d'acolade, elle va lire plusieurs fois la même expression.
Donc sur x, elle va lire plusieurs fois l'expression 127T et sur y chaque terme de l'acolade.
En gros Graph(X,Y) va commencer comme ça :
T=0 premier point (0,0) (127T = 0, et premier élément de List 1 = 0)
T=1 second point (127,0) (127T = 127, et premier élément de List 1 = 0)
trace un trait horizontal en 0
T=0 premier point (0,1) (127T = 0, et deuxième élément de List 1 = 1)
T=1 second point (127,1) (127T = 127, et deuxième élément de List 1 = 1)
trace un trait horizontal en 1
Et ainsi de suite sur tout l'écran.


Pages : 1, 2Suivante
Matt36230Hors ligneMembrePoints: 1868 Défis: 0 Message

Citer : Posté le 10/01/2016 19:30 | #


C'est assez complexe mais ça devrait aller testons ça de suite !
NinestarsHors ligneMembrePoints: 2188 Défis: 22 Message

Citer : Posté le 10/01/2016 19:53 | #


Avec le Multi DrawStat on peut faire pleins de sprites compliqués !
Bon il me reste quelques trucs à expliquer encore
Matt36230Hors ligneMembrePoints: 1868 Défis: 0 Message

Citer : Posté le 10/01/2016 20:20 | #


Chez moi le MultiDrawstat est plus lent
J'ai fait dessiner 34 lignes horizontal sur tout l'écran et le super drawstat est plus rapide 0_0... Pourtant je peux pas faire plus opti dans la rapidité :
MultiDrawstat j'ai marqué TOUS les points dans le Graph xy pas de boucle ou quoi
Super drawstat j'ai fait des listes avec tous les points aussi sans boucle non plus
C'est à n'y rien comprendre
NinestarsHors ligneMembrePoints: 2188 Défis: 22 Message

Citer : Posté le 10/01/2016 20:21 | #


Quel est ton code ?
Matt36230Hors ligneMembrePoints: 1868 Défis: 0 Message

Citer : Posté le 10/01/2016 20:22 | #


J'ai édit mon post plus haut
NinestarsHors ligneMembrePoints: 2188 Défis: 22 Message

Citer : Posté le 10/01/2016 20:26 | #


Je voudrais bien voir ton code (en photo si t'as pas la foi de recopier )
Ce que je précise au début, le MDS n'est pas forcement plus rapide que le SDS
Matt36230Hors ligneMembrePoints: 1868 Défis: 0 Message

Citer : Posté le 10/01/2016 21:11 | # | Fichier joint


Je t'envoies ça dans 20-30 minutes je dois me sustenter
C'est bon les progs sont en pièce jointe et le code ici
code
Cliquer pour enrouler
Programme 1 : Multi drawstat
ViewWindow 1,127,0,1,63,0,0,1,1Ù
Graph(X,Y)=({0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,
0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,0+128T,
0+128T,0+128T,0+128T,0+128T,0+128T},
{1+0T,2+0T,3+0T,4+0T,5+0T,6+0T,7+0T,8+0T,9+0T,10+0T,11+0T,12+0T,13+0T,14+0T,15+0T,16+0T,17+0T,18+0T,
19+0T,20+0T,21+0T,22+0T,23+0T,24+0T,25+0T,26+0T,27+0T,28+0T,29+0T,30+0T,31+0T,32+0T,33+0T})

Et le 2nd programme : super drawstat
//La c'est moche mais je l'ai fait a l'arrache c'etait juste que j'avais la
//flemme de faire les listes a la main :E
66ãDim List 1Ù
66ãDim List 2Ù
For 1ãP To 33Ù
0ãList 1[PÀ2-1]Ù
NextÙ
For 1ãP To 33Ù
128ãList 1[PÀ2]Ù
PãList 2[PÀ2]Ù
PãList 2[PÀ2-1]Ù
NextÙ
""Ø
//Je commence le chrono a partir de la
66ãTämaxÙ
1ãTäminÙ
Graph(X,Y)=(List 1[T],List 2[T])

NinestarsHors ligneMembrePoints: 2188 Défis: 22 Message

Citer : Posté le 10/01/2016 21:21 | #


Remplace tout le bloc {0+128T...} par : 128T (sans les accolades)

Et au lieu de faire une liste {1,2,3,...}, fais un Seq(X,X,1,63,1)
Matt36230Hors ligneMembrePoints: 1868 Défis: 0 Message

Citer : Posté le 10/01/2016 21:23 | #


Pour le premier ok mais le deuxième j'ai pas compris ce qu'il fallait que je change
-florian66-Hors ligneAncien rédacteurPoints: 2300 Défis: 19 Message

Citer : Posté le 10/01/2016 21:24 | #


Pas mal ce tutoriel ! Je vais peut être me remettre un peu au Basic alors !
In Arch, I trust ! And you ?
NinestarsHors ligneMembrePoints: 2188 Défis: 22 Message

Citer : Posté le 10/01/2016 21:24 | #


Tu n'as pas compris le Seq ?
Regarde le dernier exemple du tuto
Dark stormHors ligneMembre d'honneurPoints: 10776 Défis: 174 Message

Citer : Posté le 10/01/2016 23:02 | #


Tu m'impressionnera toujours à trouver de nouvelles astuces de plus en plus complexes.



Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Páranÿe quetë Quendya
Matt36230Hors ligneMembrePoints: 1868 Défis: 0 Message

Citer : Posté le 11/01/2016 18:42 | #


C'est bon là ça va vite ! Merci pour ce super tuto Ninestars
AldebariusHors ligneMembrePoints: 1083 Défis: 10 Message

Citer : Posté le 11/01/2016 18:44 | #


Ah tiens, quelque chose que j'avais pas vu
Peut-etre dans une prochaine version de Casio Dale?
Qui fait le malin tombe dans le ravin
Qui fait le malin se prend un sapin
NinestarsHors ligneMembrePoints: 2188 Défis: 22 Message

Citer : Posté le 11/01/2016 20:45 | #


Je suis tombé dessus en remarquant un comportement étrange du SDS, j'ai approfondi puis je suis tombé sur le MDS, merci DS
D'ailleurs ça s'appelle le Multi DrawStat car avec une unique commande, on dessine plusieurs choses.
Tu as vu Matt ! C'est super rapide !
EltoredoHors ligneModérateurPoints: 4291 Défis: 35 Message

Citer : Posté le 11/01/2016 20:46 | #


Je comprendrai jamais comment tu fais pour trouver 'par hasard' ce genre de trucs hyper complexes comme si tu les avais toujours sus
La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)
Matt36230Hors ligneMembrePoints: 1868 Défis: 0 Message

Citer : Posté le 11/01/2016 20:59 | #


Je suis tellement d'accord avec Elto !
LephenixnoirEn ligneAdministrateurPoints: 14722 Défis: 136 Message

Citer : Posté le 12/01/2016 18:16 | #


Eh ben, merci encore pour un tuto d'une utilité aussi capitale que l'accélération des graphismes ! Je testerai au plus vite, ce n'est pas sorcier en fin de compte.
NinestarsHors ligneMembrePoints: 2188 Défis: 22 Message

Citer : Posté le 13/01/2016 18:43 | #


Et faisant un peu n'importe quoi Eltoredo Par exemple en mettant des arguments dans des fonctions que tu ne mettrais pas d'habitude. Ici c'est simplement du Super DrawStat mais sans les [T].
En effet Lephenixnoir... Les graphismes c'est bien le problème numéro 1 du Basic
Matt36230Hors ligneMembrePoints: 1868 Défis: 0 Message

Citer : Posté le 13/01/2016 20:56 | #


Mais avec tes découverts, on se rapproche de plus en plus de quelque chose d'accessible !
Pages : 1, 2Suivante

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2019 | Il y a 21 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