[Tutoriel] Le Super DrawStat
Posté le 08/09/2013 19:36
Vous connaissez le DrawStat, et bien voici le Super DrawStat !
Pour ceux qui ne connaissent pas le DrawStat
Cliquer pour enrouler
Ce tutoriel décrit une méthode permettant dessiner des traits à l'écran. On renseigne dans deux List les coordonnées sur x et sur y de plusieurs points, puis on relie tout ces points entre eux pour faire une image
Le Super DrawStat se comporte de la même façon que le DrawStat normal, cependant la vitesse à laquelle il dessine est bien plus rapide, environ 20% à 40% pour un tracé identique. Et encore plus rapide que les F-line. Voici comment l'utiliser :
Initialisation :
Le Super DrawStat s'initialise en même temps que le ViewWindow, il suffit de rajouter à la suite les trois composantes d'initialisation.
Le paramétrage classique est ViewWindow 1,127,0,1,63,0 Il suffit de rajouter à la suite : ,
MIN,
MAX,
PAS
MIN correspondant à la valeur de départ (1 en général)
MAX la dernière valeur (la taille des List en général)
PAS la valeur dont T (Voir plus bas) augmente à chaque fois, (1 en général)
Pour choisir le dessin à tracer, il suffit de rentrer dans deux List les coordonnées x et y du dessin.
Utilisation :
Il faut utiliser la commande.
Graph(X,Y)=(
Graph(X,Y) est une commande trouvable à l'adresse : SHIFT F4 F5 F3
cette fonction prend deux arguments : la première List correspondant aux x, et la seconde List correspondant aux y.
Voici ce que cela donne au complet
Graph(X,Y)=(List 1[T],List 2[T])
Il est obligatoire de mettre [T], et uniquement T sinon cela ne fonctionnera pas. La variable T est la variable qui va permettre de "lire" le dessin.
Elle commence avec la valeur MIN définie par le ViewWindow, et augmente de PAS jusqu'a arriver à MAX. Il est donc important de bien paramétrer le ViewWindow avec des nombres entiers pour pas avoir une situation telle que List 1[3.7] si T prend la valeur 3.7, ce qui provoque une erreur.
Exemple :
Voici par exemple comment tracer un triangle formé par les points A(10;7), B(30;54) et C(18;29).
La List 1 enregistre les coordonnées des points sur l'axe x, et la List 2 sur l'axe y. Ensuite on trace un trait entre chaque points pour former le triangle. (Il y a 4 points pour refermer le triangle
)
ViewWindow 1,127,0,1,63,0,1,4,1
{10,30,18,10}->List 1
{7,54,29,7}->List 2
Graph(X,Y)=(List 1[T],List 2[T])
Astuces :
Voilà, maintenant vous avez les bases pour pouvoir utilisez le SuperDrawStat, mais son véritable atout réside dans sa flexibilité et sa liberté d'utilisation. Voici quelques astuces très utiles pour exploiter au maximum cette fonction.
Utilisez Tomin, Tomax et Toptch (VARS F1 F3) pour lire et modifier les paramètres d'initialisation MIN, MAX et PAS
MAX doit être inférieur ou égale à la taille des List.
En jouant sur ces paramètres on peut donc dessiner que les 3 premiers traits du dessins, un traits sur deux, que les derniers, ...
Attention, modifier ces paramètres modifient le ViewWindow, c'est à dire qu'au prochain dessin, l'écran sera effacé.
Il est aussi possible de dessinez avec un style de trait différent :
-traits continus : G-Connect(SHIFT MENU F6 F3)
-des points : G-Plot (SHIFT MENU F6 F3)
-traits simples : S-L-Normal (SHIFT MENU F6 F2)
-traits épais : S-L-Thick (SHIFT MENU F6 F2)
-pointillets épais : S-L-Broken (SHIFT MENU F6 F2)
-pointillets : S-L-Dot (SHIFT MENU F6 F2)
Il est possible d'utilisez des équations à la place des List :
Graph(X,Y)=(List 1[T],4)
Graph(X,Y)=(17xList 1[4T],List 2[T]+4)
Graph(X,Y)=(15+T,List 1[T])
...
(La variable qui évolue c'est T, pas X)
Ainsi on peut éviter de créer des List simple comme par exemple {0,1,2,3,...} en remplacant par T qui va prendre successivement ces valeurs (tout dépend du paramétrage bien entendu).
Vous pouvez facilement effectuer un décalage pour afficher vos images.
Par exemple imaginons que vous avez enregistré l'image d'un personnage, dans les List 1 et List 2
En DrawStat
Cliquer pour enrouler
Pour l'afficher aux coordonnées I et J vous deviez faire en DrawStat
{...}->List 1
{...}->List 2
S-Gph1 DrawOn,xyline,List 3,List 4,1,Dot
...
I+List 1->List 3
J+List 2->List 4
DrawStat
On est obligé d'utiliser des List 3 et List 4 pour ne pas modifier les List 1 et List 2 qui enregistrent l'image.
Tandis que en Super DrawStat, on peut s'en passer
{...}->List 1
{...}->List 2
Dim List 1->Tomax
Graph(X,Y)=(I+List 1[T],J+List 2[T])
Dim List 1 permet de récupérer la taille de la List 1. On n'utilise jamais les variables X et Y, elles sont modifiées par les fonctions graphiques donc le résultat ne sera pas ce à quoi vous vous attendiez
Il est également possible de ne pas relier deux points consécutifs dans les List. Par exemple si notre dessin est en plusieurs parties (imaginons un personnage et ses yeux).
L'astuce consiste à rajouter un point trop éloigné pour que la calculette ne le dessine pas et passe au suivant.
par exemple
{10,23,7,e9,12,3}-List 1
{34,30,7,e9,2,3}-List 2
e9 est une façon courte d'écrire 1000000000
Encore plus de vitesse ? Dessiner à la chaîne !
Il arrive que dans certains jeux, il faille dessiner beaucoup d'images à la suite.
Je vais prendre l'exemple d'une carte que l'on veut dessiner en utilisant le principe des
Tiles, ou tuiles en français (entre autres pokemon), on pense naturelement à parcourir dans une boucle toutes les cellules de notre Mat, List, ... qui enregistre notre carte, et afficher les images les unes après les autres.
Cette méthode est simple, mais on voit l'image se construire au fur et à mesure. Le rendu n'est pas terrible et donne une impression de lenteur.
Pour résoudre ce problème, on va charger toutes les images dans une même List, puis tout afficher d'un coup !
Je vous présente la fonction Augment( OPTN F1 F6 F5
Cette fonction permet de mettre bout à bout deux List pour n'en former qu'une
{1,2,3}->List 1
{4,5,6}->List 2
Augment(List 1, List 2)->List 3
List 3 = {1,2,3,4,5,6}
Ainsi votre code pour afficher votre carte aura cette structure :
{e9}->List 1
{e9}->List 2
// boucle
// on récupère dans List 3 et List 4 l'image de tile
Augment(List 1, List 3)->List 1
Augment(List 2, List 4)->List 2
// fin de boucle
Dim List 1->Tomax
GraphXY(List 1[T], List 2[T])
On voit que GrapXY n'est utilisé qu'à la fin, avec les List 1 et 2 remplies, donc la carte est tracé en une fois beaucoup plus rapidement.
Pourquoi List 1 et 2 sont initialisées avec e9 ? Simplement que l'on ne peut pas initialiser des List vides, pour utiliser Augment, il faut au moins un élément dans chaque List.
Il reste une dernière précaution, ajouter e9 à la fin de chaque image, sinon elles seront toutes reliées, évidemment
Pour donner un ordre d'idées, le
gain de vitesse est de 10% pour dessiner des images d'une vingtaine de points et
35% pour dessiner des images avec peu de points. Le système est plus rentable, si le nombre de point par image et faible.
L'inconvénient c'est qu'il y a un temps d'attente, mais placer un Text 1,1,"Chargement" fait tellement pro
mais aussi que cette technique est gourmande en mémoire.
Exemple de jeux utilisant cette méthode :
Block Tower,
A vers B
Economisez les indices de List :
Deux List pour chaque image est assez gourmand en indice, même si il y en a 26 par fichier. Une autre astuce permet d'enregistrer dans une seule List à la fois les coordonnées sur x et sur y d'une image. Pour cela on va utiliser les complexes.
ViewWindow 1,127,0,1,63,0,1,4,1
{10,30,18,10}+i{7,54,29,7}->List 1
Graph(X,Y)=(ReP List 1[T],ImP List 1[T])
On renseigne dans une première accolade les coordonnées x, ensuite on rajoute le
i (SHIFT 0) puis on renseigne dans une deuxième accolade les coordonnées sur y. Rep et Imp permettent de séparer la partie sur x et la partie sur y (OPTN F3 F6). On remarquera que dans l'initialisation du ViewWindow, MAX est toujours égale à 4. La taille de List 1 est toujours 4 et pas 8. Attention, cette astuce ne permet pas de gagner de la mémoire : le poids en octet d'une telle List est multiplier par deux, ce qui pèse autant que deux List.
Performances :
J'ai fait des tests pour comparer les performances :
dessiner 128 traits une fois :
-DrawStat : 1,4 s
-Super DrawStat : 0,9 s
dessiner 3 traits 100 fois :
-DrawStat : 22,4 s
-Super DrawStat : 18,9 s
On voit clairement que le Super DrawStat est plus rapide, en fait le DrawStat affiche les points puis trace les traits alors que le Super DrawStat dessine directement les traits.
Inconvénients :
Il existe deux incovénients, d'une part cela utilise la variable T, qui devient donc inutilisable dans le programme.
D'autre part, il n'est pas possible de dessiner des petits carrés ou des croix comme en DrawStat.
Voilà, si découvrez d'autres astuces n'hésitez pas à les partager, il est en existe énormément
Regardez aussi le tutoriel sur le Multi DrawStat, pas forcement plus rapide, mais qui permet d'autres choses.
Citer : Posté le 17/11/2014 21:33 | #
Sur la Prizm, c'est total free ! J'ai fais l'image d'accueil du jeu Islands avec seulement les listes 1 et 2 qui changent de taille a chaque morceau de dessin sans aucun problème ni erreur. Je pensais que c'était pareil sur les autres graph d'où mes soucis de portage du jeu sur graph 35+
Citer : Posté le 04/02/2015 10:07 | #
Tout d'abord, bonjour à tous les "forumeurs" et je remercie tout particulièrement les administrateurs et le webmaster pour cet excellent site dédié aux calculatrices Casio
(NB: mon ancien métier Cireur de pompes ! )
Passons maintenant aux choses "sérieuses"
J'ai pas dû bien tout comprendre sur le "SuperDrawStat".... :
J'ai créer un code ci-dessous qui permet de faire un simple carré sur l'écran, à partir de 3 outils différents:
Le F-Line, le drawstat et enfin le fameux "superdrawstat" (qui pour moi est tout sauf super ...). Peut-être que vous pourrez m'aider à mieux comprendre ??? Le Drawstat c'est vrai est le plus rapide de tous, mais vient juste après le F-Line !!!
Et très loin après, en fait le graphe paramétrique (appelé "superdrawstat" par Ninestarts).
Bon voici le code et merci d'avance à ce qui voudront bien me répondre....
ViewWindow 1,127,0,1,63,0,0,32,32
AxesOff:LabelOff:FuncOff:BG-None
S-WindMan
{48,80,80,48,48}→List 1
{16,16,48,48,16}→List 2
Text 1, 1,"F-Line Demo"
For 1→A To 4
F-Line List 1[A],List 2[A],List 1[A+1],List 2[A+1]
Next◢
Cls:ClrText
Text 1,1,"DrawStat"
S-Gph1 DrawOn,xyLine,List 1,List 2,1,Dot
S-Gph2 DrawOff:S-Gph2 DrawOff:DrawStat
CoordOn:Plot ◢
Cls:ClrText
{48,48}→List 1
{16,48}→List 2
Text 1, 1,"SUPERDRAWSTAT"
Graph(X,Y)=(T+List 1,List 2)
Graph(X,Y)=(List 1,T+List 2)
Graph(X,Y)=(80,T+16)
Plot ◢
Je possède une fx-8930GT
Un peu de tolérance pour les vieux
Citer : Posté le 04/02/2015 13:05 | #
La différence n'est pas flagrante quand il y a pas beaucoup de point mais quand il y a 50 ou 100 points différents là tu vois la différence.
Ajouté le 04/02/2015 à 13:07 :
Pourquoi 3 fois ?
Graph(X,Y)=(List 1,T+List 2)
Graph(X,Y)=(80,T+16)
Citer : Posté le 08/02/2015 23:24 | #
Faut faire ça :
Graph(X,Y)=(List 1[T], T+List 2[T])
Graph(X,Y)=(80, T+16)
Citer : Posté le 08/02/2015 23:32 | #
Non plus, c'est ça qu'il faut faire :
{16,16,48,48,16}→List 2
ViewWindow 1,127,0,1,63,0,1,5,1
Graph (X,Y)=(List 1[T],List 2[T])
Citer : Posté le 09/02/2015 00:10 | #
Ah mais j'ai pas fait attention au reste du code
Je dis juste que Graph(X,Y)=(List 1, List 2) est carrément plus lent que Graph(X,Y)=(List 1[T], List 2[T])
Citer : Posté le 09/02/2015 13:35 | #
Bon, c'est Remiweb qui a raison, cela fonctionne très bien sur l'émulateur Graph 85 mais pas sur ma graph 30 qui indique une erreur de synthaxe au niveau Graph (X,Y)=(List 1[T],List 2[T])???
(j'ai vérifié plusieurs fois rien à faire !!!). Il n'aime pas la lettre "T" (le synthax error se fait à ce niveau). (à mon avis, sur cette calto c'est la variable T qui sert au graphe paramétrique, et elle ne peut pas être aussi affectée en tant que compteur de liste.
(j'avais écrit ton code au départ sur la mienne mais comme cela ne fonctionnait pas, j'en avais créer un autre).
De même que j'avais remarqué qu'il était possible de créer des listes et des matrices par la fonction Dim, genre [2,3]→Dim Mat A qui fonctionne sur les calto dernière génération Graph35+ à Graph 95 mais impossible sur la mienne.Mais là, c'est parfaitement bien expliquer dans la notice Casio de ma Graph 30 donc pas de surprise, hélas.
(Sur Graph 30, le Dim sert de visu de la Matrice ou de la liste, la lecture ok mais pas l'écriture !).
Je remercie donc Remiweb et Dark Storm pour vos réponses, elles m'ont bien éclairés ! le superdrawstat ne fonctionne pas sur Graph 30, voilà la conclusion !!!!
Je possède une fx-8930GT
Un peu de tolérance pour les vieux
Citer : Posté le 09/02/2015 13:41 | #
oui je sais plus ou javais vu ca mais le T est un parametre du view windows avec le super drawstat il est utilisé avec une atre variable (je sais plus laquelle ) mais il faut que tu en prennes une autre
Ajouté le 09/02/2015 à 13:43 :
c'est page deux en fait
-Mon Fall Down
-Mon jeu de mains
-Mon starwars
-Mon dessinatout
-Mon niaiseux version 2.0
-Mon niaiseux version 3.0
-Inferno
-Mon super labyrinthe (en cours)
-Mon call of duty en 3D
-Casion (avec Az)
Citer : Posté le 09/02/2015 14:54 | #
t est simplement la variable paramétrique.
Un graphe « classique » est composé de points de coordonnées (x;f(x)), là où un graphe paramétrique est constitué de points aux coordonnées (x(t);y(t)).
Y'a aussi le polaire, mais là c'est différent on table sur angle/longueur, plus ou moins argument/module en fait...
Citer : Posté le 06/05/2015 21:19 | #
Il faudrait rajouter l'astuce de RemiWeb qui est très pratique.
Citer : Posté le 17/07/2015 11:08 | #
Excellent tuto ! On a pas fini d’accélérer le graphisme sur nos casios !
Citer : Posté le 17/07/2015 11:12 | #
J'aurais quand même tendance à penser qu'avec ça, on a fini... ^^'
Cela dit, c'est déjà une méthode très rapide.
Citer : Posté le 17/07/2015 11:13 | #
Cela dit, c'est déjà une méthode très rapide.
Tout est relatif ...
Citer : Posté le 17/07/2015 11:17 | #
Hmm, on peut quand même afficher un curseur ou quelques traits de manière presque instantanée.
Faut bien comprendre que l'instantané graphique en Basic est un concept onirique à la base... x)
Citer : Posté le 17/07/2015 11:20 | #
Oui, tu as raison, je suis jamais satisfait
Citer : Posté le 17/07/2015 12:07 | #
Même si c'est rapide pour afficher un décors par exemple, ça l'est moins pour déplacer un sprite de 16*16 de manière fluide.
Si tu rajoute des éléments qui s'actualise a chaque frames comme des obstacles à éviter par exemple, alors là n'en parlons même pas .
Citer : Posté le 17/07/2015 12:21 | #
Pour accélérer encore plus, faut utiliser PRGM2, mais là c'est de la triche.
Citer : Posté le 17/07/2015 12:24 | #
Bah surtout qu'il faut une graph75+ (ou une graph 35+ tweakée) ainsi que PRGM2 donc ce n'est pas terrible pour la portabilité du programme .
Citer : Posté le 17/07/2015 12:29 | #
C'est ce que je dis, c'est de la triche
Citer : Posté le 17/07/2015 12:36 | #
PRGM2 a quand même des défauts, pour moi c'est pour ça qu'il ne s'est pas beaucoup répandu...
Citer : Posté le 17/07/2015 12:39 | #
Le reset forcé ? Je voulais faire une version moins bugguée et incluse dans WebCalc, mais c'est ajouté à la liste de mes trop nombreux projets.