[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/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.
Citer : Posté le 17/07/2015 16:49 | #
Le reset forcé ?
Ah parce qu'en plus il reset la machine ?
Je voulais faire une version moins bugguée et incluse dans WebCalc, mais c'est ajouté à la liste de mes trop nombreux projets.
What ? Quel rapport avec WebCalc ?
Citer : Posté le 17/07/2015 17:43 | #
Heu, CalcCenter, au temps pour moi ><
Citer : Posté le 18/07/2015 21:33 | #
Hmph, le problème de CalcCenter c'est qu'on ne peut pas l'utiliser assez facilement, je pense.
D'ailleur le reset forcé de PRGM2 je ne le comprends pas... ah, si, peut-être que le sous-programme PRGM ne s'arrête jamais.
Ah mais heu, </HS> là quoi au fait.
Citer : Posté le 19/12/2015 07:43 | #
Suite au message de Kirafi dans Casio Dale, et avant de tout recoder, j'aurais aimé savoir si il était possible de juste dessiner des points en superdrawstat.
Merci de votre reponse rapide et précise
Edit : j'ai test et ça marche
le probleme, c'est comme les str, on peut pas mettre list1[T]+MatX[1,1] par exemple...
Citer : Posté le 19/12/2015 11:17 | #
J'allais justement suggérer le super Drawstat pour Casio Dale.
Pour le soucis que tu évoques, tu peux faire List1+MatX[1,1→List2 puis tracer List2[T].
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 19/12/2015 11:21 | #
Merci Ne0tux , mais je suis resté sur le Drawstat pour l'instant à cause du problème ci-dessous:
Où est-ce que je met le DotG, parce que si je fais DotG Graph(X,Y)=... , ma calto me met erreur argument?
Citer : Posté le 05/01/2016 13:44 | #
Je me pose la même question qu'Aldebarius et aussi comment dessiner deux carrés par exemple distinct l'un de l'autre avec le même Graph (X,Y) ?
Un beat them all pour les CPC 19
Un jeu de Tank multijoueur en version graphique
Un jeu de boxe rigolo
Le moteur de combat épique d'un RPG
soccer physics : Un jeu de foot totalement wtf !
Survie 1 & 2 te laisseras-tu attraper par la méchante IA ?
Séquestrez les tous avec Catch'em all !
Joué à la calcultarice et pécher ? Facile !
Battle un système de combat dément !!
Débombe pas tout à fait un démineur
Mon mario pour le concours des 10 ans de PC
Casio jump un doodle jump pas comme les autres !
Rush four your life : tu cours ou tu meurs
Cookie clicker ! More cookies MOOORE !
Move et esquive : bouge pour esquiver les ennemis !
Guitar Hero !! Let's rock !
INVASION : Au secours on se fait envahir !
Un devine nombre entièrement customisable (mon 1er jeu)
Un outil pour dessiner des sprites en super drawstat et qui vous le compile pour vous donner un code utilisable dans vos programmes
Un super programme de dessin bourré de trucs funcs
Sortir une version finale de Tankasio
Bien m'améliorer en C parce que pour l'instant c'est pas jojo
Une ou plusieurs idées qui mûrissent petit à petit
Citer : Posté le 05/01/2016 13:49 | #
Salut Matt' !
Pour ça c'est très simple, il suffit d'ajouter un point "à l'infini" entre tes graphismes (de coordonnées 1000;1000 par exemple).
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 05/01/2016 13:59 | #
Merci Ne0tux ! Il me semble que j'avais essayé mais ça dessinait le trait qui était visible Ca devait être en drawstat La ça fonctionne parfaitement
Un beat them all pour les CPC 19
Un jeu de Tank multijoueur en version graphique
Un jeu de boxe rigolo
Le moteur de combat épique d'un RPG
soccer physics : Un jeu de foot totalement wtf !
Survie 1 & 2 te laisseras-tu attraper par la méchante IA ?
Séquestrez les tous avec Catch'em all !
Joué à la calcultarice et pécher ? Facile !
Battle un système de combat dément !!
Débombe pas tout à fait un démineur
Mon mario pour le concours des 10 ans de PC
Casio jump un doodle jump pas comme les autres !
Rush four your life : tu cours ou tu meurs
Cookie clicker ! More cookies MOOORE !
Move et esquive : bouge pour esquiver les ennemis !
Guitar Hero !! Let's rock !
INVASION : Au secours on se fait envahir !
Un devine nombre entièrement customisable (mon 1er jeu)
Un outil pour dessiner des sprites en super drawstat et qui vous le compile pour vous donner un code utilisable dans vos programmes
Un super programme de dessin bourré de trucs funcs
Sortir une version finale de Tankasio
Bien m'améliorer en C parce que pour l'instant c'est pas jojo
Une ou plusieurs idées qui mûrissent petit à petit
Citer : Posté le 05/01/2016 18:09 | #
Il faut qu'il soit vraiment "loin". Genre (200, 200) il me semble que ça l'affiche. Du coup pour optimiser tu peux faire e9 (si ça marche, ça ne fait plus que 3 octets)
Citer : Posté le 05/01/2016 19:04 | #
1000 fonctionne parfaitement bien Et je confirme quand c'est trop près ça affiche c'est ce que j'avais essayé avant
Et e3 (plus rapide que e9) fonctionne nickel aussi Ca marche pareil en drawstat normal mais c'est ultra lent quand ça arrive sur ce point
Un beat them all pour les CPC 19
Un jeu de Tank multijoueur en version graphique
Un jeu de boxe rigolo
Le moteur de combat épique d'un RPG
soccer physics : Un jeu de foot totalement wtf !
Survie 1 & 2 te laisseras-tu attraper par la méchante IA ?
Séquestrez les tous avec Catch'em all !
Joué à la calcultarice et pécher ? Facile !
Battle un système de combat dément !!
Débombe pas tout à fait un démineur
Mon mario pour le concours des 10 ans de PC
Casio jump un doodle jump pas comme les autres !
Rush four your life : tu cours ou tu meurs
Cookie clicker ! More cookies MOOORE !
Move et esquive : bouge pour esquiver les ennemis !
Guitar Hero !! Let's rock !
INVASION : Au secours on se fait envahir !
Un devine nombre entièrement customisable (mon 1er jeu)
Un outil pour dessiner des sprites en super drawstat et qui vous le compile pour vous donner un code utilisable dans vos programmes
Un super programme de dessin bourré de trucs funcs
Sortir une version finale de Tankasio
Bien m'améliorer en C parce que pour l'instant c'est pas jojo
Une ou plusieurs idées qui mûrissent petit à petit
Citer : Posté le 05/01/2016 19:05 | #
Si e3 fonctionne, c'est niquel.
Citer : Posté le 10/01/2016 15:00 | #
Grosse nouveauté en approche ! Décidement le Super DrawStat a un potentiel incroyable !
1,00s pour remplir entièrement l'écran...
Et possibilité de dessiner des traits et des points en même temps !
Citer : Posté le 10/01/2016 15:06 | #
En 1 seconde ?
Citer : Posté le 10/01/2016 19:16 | #
WHAT ?! Mais c'est génial ! On pourra peut-être faire des jeux rapides avec des beaux graphismes (je ne compte pas zelda de remiweb )
Je suis extrêmement pressé de découvrir ça
Un beat them all pour les CPC 19
Un jeu de Tank multijoueur en version graphique
Un jeu de boxe rigolo
Le moteur de combat épique d'un RPG
soccer physics : Un jeu de foot totalement wtf !
Survie 1 & 2 te laisseras-tu attraper par la méchante IA ?
Séquestrez les tous avec Catch'em all !
Joué à la calcultarice et pécher ? Facile !
Battle un système de combat dément !!
Débombe pas tout à fait un démineur
Mon mario pour le concours des 10 ans de PC
Casio jump un doodle jump pas comme les autres !
Rush four your life : tu cours ou tu meurs
Cookie clicker ! More cookies MOOORE !
Move et esquive : bouge pour esquiver les ennemis !
Guitar Hero !! Let's rock !
INVASION : Au secours on se fait envahir !
Un devine nombre entièrement customisable (mon 1er jeu)
Un outil pour dessiner des sprites en super drawstat et qui vous le compile pour vous donner un code utilisable dans vos programmes
Un super programme de dessin bourré de trucs funcs
Sortir une version finale de Tankasio
Bien m'améliorer en C parce que pour l'instant c'est pas jojo
Une ou plusieurs idées qui mûrissent petit à petit
Citer : Posté le 23/03/2016 11:13 | #
Petite mise à jour du tuto, j'ai rajouté une intro pour les débutants, une mise en garde et une astuce pour compléter d'avantage le tuto
Ajouté le 10/05/2016 à 22:57 :
Ajout d'un nouveau point !!!
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
{4,5,6}->List 2
Augment(List 1, List 2)->List 3
Ainsi votre code pour afficher votre carte aura cette structure :
{e9}->List 2
For 1->I To ...
For 1->J To ...
Mat A[I,J]->Z
Prog "XXX"
Augment(List 1, List 3)->List 1
Augment(List 2, List 4)->List 2
Next
Next
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
Citer : Posté le 11/05/2016 17:16 | #
Ah ah, excellent !
J'y avais jamais pensé, mais attention tout de même, une map faite de tiles d'en moyenne 9 points (ce qui est assez faible) sur 8 * 8 pixels va nécessiter, pour générer les listes, une place mémoire de 30720 octets !
Citer : Posté le 11/05/2016 20:11 | #
En effet c'est un compromis entre vitesse et place en mémoire, c'est pas utilisable dans tous les cas, mais le gain en vitesse est impressionnant. Je l'utilise dans mon jeu A vers B, je sais pas si tu as testé, mais l'affichage est hyper rapide au vu du nombre de sprite
Citer : Posté le 12/05/2016 00:04 | #
Je dis ça humblement mais je n'ai pas bien saisi la nouveauté. Ce n'est pas plus ou moins ce dont on parlait implicitement avec Matt et Darkstorm en janvier ici même ?
D'ailleurs même en utilisant "Augment(", il faut tout de même ajouter un point à l'infini entre deux tiles pour assurer qu'il n'y ait pas de ligne parasite, non ?
En tout cas je plussoie, cette technique est la plus efficace (je l'utilise, mais probablement pas dans les projets que j'ai publiés). D'ailleurs je ne veux pas dire de bêtises mais pour accélérer la vitesse d'affichage il vaut mieux ne pas utiliser de sous-programme pour la création des Lists de Tiles.
Le must c'est de charger avant chaque tile dans des Lists séparées, et de faire un "Augment(" avec les Lists qui vont bien pour chaque cas. Ça prend un peu plus de place au niveau du code mais ça fait gagner du temps si je ne m'abuse.
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 12/05/2016 20:01 | #
Ce n'est pas plus ou moins ce dont on parlait implicitement avec Matt et Darkstorm en janvier ici même ?
Je vois des infinis mais pas d'Augment( personnellement... je pense que non. J'ai relu tout le topic et je ne vois aucune référence à cette technique