Forum Casio - Vos tutoriels et astuces


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

[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.


Pages : Précédente1, 2, 3, 4, 5, 6Suivante
Alex BasicCHors ligneAncien modérateurPoints: 1734 Défis: 83 Message

Citer : Posté le 15/09/2013 11:02 | #


Très bon tuto, bien organisé


Ajouté le 15/09/2013 à 11:06 :
Il marche sur prizm, on a du drawstat sans les points !!!
Et rapide en plus

:bow: :bow:Ninestars :bow:
NinestarsHors ligneMembrePoints: 2171 Défis: 22 Message

Citer : Posté le 15/09/2013 11:22 | #


Merci Pourquoi il se passe quoi sur la prisme avec le DrawStat ?
EiyeronHors ligneAncien modérateurPoints: 5513 Défis: 57 Message

Citer : Posté le 15/09/2013 11:43 | #


Un gros carré de 8*8 à chaque point du drawstat. même en mode dot.
LancelotHors ligneMembrePoints: 1274 Défis: 160 Message

Citer : Posté le 15/09/2013 11:50 | #


j'avais remarqué ceci

Mais le super Drawstat ne gère pas les traits (gros, fin,...) dans un programme.
Calculatrices : Casio 35+ SH4 (modifiée 75) et fx-CG 20 PRIZM
Projets que je soutiens
Des exemples parmi tant d'autres
Pokémon Jade de Dododormeur
Zelda de Smashmaster
Super Geek Brothers de Siapran
Mes Programmes
Mes Programmes
Mes Projets
Mes Projets
ColorLib
Add-ins Jetpack Joyride et Pac-Man sur PRIZM (les 2 non commencés mais en réflexion)
A la recherche des sprites jetpack Joride si quelqu'un les a en couleur
NinestarsHors ligneMembrePoints: 2171 Défis: 22 Message

Citer : Posté le 15/09/2013 13:06 | #


Ah oui c'est bien moche ce carré dans ce cas :/
Lancelot a écrit :
Mais le super Drawstat ne gère pas les traits (gros, fin,...) dans un programme.
Comment ça, sur Prizm ? Moi ça fonctionne parfaitement.
LancelotHors ligneMembrePoints: 1274 Défis: 160 Message

Citer : Posté le 15/09/2013 14:19 | #


Oui, sur la Prizm, ce doit être une erreur de ma part.

désolé
Calculatrices : Casio 35+ SH4 (modifiée 75) et fx-CG 20 PRIZM
Projets que je soutiens
Des exemples parmi tant d'autres
Pokémon Jade de Dododormeur
Zelda de Smashmaster
Super Geek Brothers de Siapran
Mes Programmes
Mes Programmes
Mes Projets
Mes Projets
ColorLib
Add-ins Jetpack Joyride et Pac-Man sur PRIZM (les 2 non commencés mais en réflexion)
A la recherche des sprites jetpack Joride si quelqu'un les a en couleur
TotoyoHors ligneMembre d'honneurPoints: 15903 Défis: 101 Message

Citer : Posté le 15/09/2013 19:27 | #


Bonne nouvelle pour la Prizm, peut-être qu'on aura de nouveaux jeux sur cette calculatrice !

Ajouté le 24/09/2013 à 22:10 :
Alex BasicC a écrit :
Très bon tuto, bien organisé


Ajouté le 15/09/2013 à 11:06 :
Il marche sur prizm, on a du drawstat sans les points !!!
Et rapide en plus

:bow: :bow:Ninestars :bow:

J'ai fait quelques tests comparatifs entre la Graph 85 SD v2.01 et la Fx-CG 20 v1.04 et je suis bluffé par la puissance de cette technique. Globalement, la Fx-CG 20 trace le graphique 2 fois moins vite, mais c'est amplement plus rapide qu'avez les fonctions graphiques de base.
Voici le programme de test :
ClrList
For 1->B To 99
RanInt#(1,127->List 1[B
RanInt#(1,63->List 2[B
Next
ViewWindow 1,127,0,1,63,0,1,Dim List 1,1
SketchThin Graph(X,Y)=(List 1[T],List 2[T

Alex_1186Hors ligneMembrePoints: 1215 Défis: 46 Message

Citer : Posté le 24/10/2013 11:32 | #


Wahou, mais c'est génial! Je viens de découvrir ce tuto à l'instant...
: mode grotteux désactivé :

Félicitations et merci Ninestars pour l'astuce!
Projets que je soutiens
Projets que je soutiens
Robscape 2 de Ray
Les tests vidéo de Marmotti
Mes projets
Mes projets
Une dizaine de projets top secrets...

Timeless Remix Airwolf
"And the dream will never die..."
NinestarsHors ligneMembrePoints: 2171 Défis: 22 Message

Citer : Posté le 24/10/2013 15:13 | #


Merci
PseudopourriHors ligneMembrePoints: 182 Défis: 9 Message

Citer : Posté le 14/03/2014 19:33 | #


[detterage] j'ai mis:
ViewWindow 1,127,0,1,63,0,1,4,1
S-WindMan
FuncOff
S-Gph1 DrawOn,xyLine,List 1,List 2,1,Dot
S-Gph2 DrawOff
S-Gph3 DrawOff
{1,1}->List 1
{127,63}->List 2
Graph(X,Y)=(List 1[T],List 2[T])
et il me dis erreur dimension (en fait ça fait des mois que j'essaye de comprendre,en vain sauf pour le drawstat).[/detterage]
je code en...
je code en:

-ASM (assembleur) sur x86 et gb-Z80
-locomotive basic/amstrad basic
-Basic Casio
-VBS
-Batch
-Bash
-Python 3.4
-html
-CSS
-javascript
-Lua
-brainfuck
-ruby

Il faut savoir que je ne maitrise pas parfaitement tout ces langages

[/spoiler]
Remerciment

Ma calto: graph 75
TotoyoHors ligneMembre d'honneurPoints: 15903 Défis: 101 Message

Citer : Posté le 14/03/2014 19:37 | #


ViewWindow 1,127,0,1,63,0,1,42,1

Tes listes 1 et 2 ont une dimension égale à 2. Or, dans ton ViewWindow, tu dis qu'il doit aller jusqu'à la case n°4 d'où l'erreur de dimension.
NinestarsHors ligneMembrePoints: 2171 Défis: 22 Message

Citer : Posté le 14/03/2014 21:33 | #


S-WindMan
FuncOff
S-Gph1 DrawOn,xyLine,List 1,List 2,1,Dot
S-Gph2 DrawOff
S-Gph3 DrawOff

Cette partie ne sert à rien pour le Super DrawStat.

ViewWindow 1,127,0,1,63,0,1,4,1
Le 1 indique à partir à quelle valeur T commence (1 est très bien)
Le 4 indique jusqu'a combien T augmente, ici 4 donc tes listes doivent avoir une taille de 4 au minimum
Le 1 indique de combien T augmente, 1 est le chiffre qu'il faut (c'est rare de mettre autre chose)
voilà un petit récap

Ajouté le 14/03/2014 à 21:45 :
J'ai rajouté un exemple dans le tuto.
PseudopourriHors ligneMembrePoints: 182 Défis: 9 Message

Citer : Posté le 15/03/2014 11:34 | #


Merci beaucoup ça faisait des mois que je me creusais la tête pour comprendre,grâce à vous je vais pouvoir faire la partie jeu de mon zelda.
je code en...
je code en:

-ASM (assembleur) sur x86 et gb-Z80
-locomotive basic/amstrad basic
-Basic Casio
-VBS
-Batch
-Bash
-Python 3.4
-html
-CSS
-javascript
-Lua
-brainfuck
-ruby

Il faut savoir que je ne maitrise pas parfaitement tout ces langages

[/spoiler]
Remerciment

Ma calto: graph 75
RiptorHors ligneMembrePoints: 722 Défis: 0 Message

Citer : Posté le 20/03/2014 15:25 | #


Yahoo, bon d'abord il faut bien entendu que je remercie Ninestars pour cette belle découverte

Mais je vais également remercier Pseudopourri pour son déterrage de topic car sans lui je serai sûrement passé à côté de cette super fonction qui va me permettre d'accélérer mon futur jeu sur lequel je bosse à fond et qui met l'accent justement sur les graphismes (contrairement à Tokitori) et pour lequel je dois également déplacer des sprites donc je vais bien m'amuser avec ça

Question, ça fonctionne sur tous les modèles de Casio ?
Alex BasicCHors ligneAncien modérateurPoints: 1734 Défis: 83 Message

Citer : Posté le 20/03/2014 16:29 | #


Les 35+USB, 75/85/95 et ta CG20 et peut être pour les 35+
Je ne sais pas pour les classpads je teste si j'ai le temps
Clem69silverHors ligneMembrePoints: 4 Défis: 4 Message

Citer : Posté le 02/04/2014 20:07 | # | Fichier joint


Bonjour, pourquoi un exemple de code comme ceci me fait apparaître une "erreur syntaxe" ?
J'ai pourtant bien compris le super drawstat grâce au tuto

Ajouté le 02/04/2014 à 20:07 :
Le code était en fichier joint ;p
TotoyoHors ligneMembre d'honneurPoints: 15903 Défis: 101 Message
RiptorHors ligneMembrePoints: 722 Défis: 0 Message

Citer : Posté le 15/04/2014 21:36 | #


Clem69silver a écrit :
Bonjour, pourquoi un exemple de code comme ceci me fait apparaître une "erreur syntaxe" ?


J'ai regardé ton code rapidement mais pas de quoi tester pour le moment.
Ca doit peut être venir de tes variables utilisées, ne jamais utiliser X ou Y quand on fait des graphismes car ils prennent justement les coordonnées de ce que tu traces.
Remplace les par A et B pour voir.

Edit : Quoi que ça ne devrait pas te ramener une erreur de synthaxe
Et puis il manque une boucle dans ton programme
FabcvlrHors ligneMembrePoints: 2031 Défis: 41 Message

Citer : Posté le 17/11/2014 10:12 | #


Le superdrawstat pour les Casio de graph 35+ à 95 SD renvoie une erreur dimension si le nombre d'éléments des listes est inférieur au TtétaMax du ViewWindow. Ce qui n'est pas le cas pour la cg-20 (vous pouvez mettre 50 même si les listes n'ont que 5 éléments, ça marche quand même)
Deuxième soucis, sur la 35+, quand on change le TtétaMax cela efface l'ancien tracé.
L'expérience des autres, c'est comme une chandelle que l'on tient allumée dans son dos par une nuit de tempête !
LephenixnoirHors ligneAdministrateurPoints: 14128 Défis: 136 Message

Citer : Posté le 17/11/2014 17:35 | #


Fabcvlr a écrit :
Deuxième soucis, sur la 35+, quand on change le TtétaMax cela efface l'ancien tracé.

Dès qu'on touche à une variable du View-Window, il s'efface.
Pourquoi, ce n'est pas comme ça sur Prizm ?

On voit transparaître le dessin des îles aléatoires d'Islands sur G85
FabcvlrHors ligneMembrePoints: 2031 Défis: 41 Message

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+
L'expérience des autres, c'est comme une chandelle que l'on tient allumée dans son dos par une nuit de tempête !
Pages : Précédente1, 2, 3, 4, 5, 6Suivante

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