[Tutorial] Effet de particule en Basic
Posté le 09/02/2013 12:19
Avant de s'attaquer à ce tutorial il est important de comprendre l'utilisation du Drawstat.
Présentation :
Qu'est ce qu'un "effet de particule" ?
On en retrouve partout, il s'agit en fait de petites particules individuelles qui peuvent bouger pour donner des effets visuels comme par exemple la pluie, la neige, de l'eau, de la terre, ...
Toutes ces particules qui semblent avoir un comportement aléatoire et totalement indépendant des autres suivent en réalité un shéma commun, c'est à dire qui est possible de les gérer toutes en même temps avec des équations plus ou moins simples.
Le problème :
Le gros problème c'est que les performances de la calculatrice ne permettent pas de gérer beaucoup de particules, et que de plus, il faudrait calculer leur nouvelle position l'une après l'autre ce qui au bout d'une dizaine de particules rendrait les calcules trop long. En effet il faut pouvoir garder le maximum d'image par seconde pour obtenir un effet fluide et agréable.
C'est pourquoi il faut utiliser le "Calcul Listique", ce principe consiste à calculer directement avec les List au lieu de calculer chaque terme de la List.
Par exemple :
Ces codes multiplient par 2 une liste de nombres
{0,1,2,3,4,5}->List 1
For 1->I To 6
List1[I]x2->List 1[I]
Next
{0,1,2,3,4,5}->List 1
2xList 1->List 1
Vous voyez que le second code évite la boucle For qui est plus lente.
Juste pour information la première solution met 4,5 secondes pour 500 termes tandis que l'autre met 0,4 secondes !!!
Le "Calcul Listique" fonctionne avec toutes les opérations simples mais également avec les opérations plus complexes comme Cos, Int, Abs, Frac, Mod, ...
Le "Calcul Listique" :
Il existe plusieurs astuces :
Savoir si des termes d'une List sont inférieur à 0, ce qui est intéressant pour savoir si une particule sort de l'écran.
{1,7,-8,5,-2.98 0}->List 1
List 1<0->List 2
List 2 = {0,0,1,0,1,0}
Les comparateurs ( < > <= >= ) renvoie une List avec des valeurs binaires.
Savoir si un terme quelconque est inférieur à 0
{1,2,7}->List 1
Max(List 1<0)->M
M = 0
{-1,2,7}->List 1
Max(List 1<0)->M
M = 1
Il serait bien de pouvoir si une particule qui sort de l'écran par le bas (y<0) la remonter en haut de l'écran, c'est possible
{56,-9,30,-1}->List 1
Mod(List 1,64)->List 1
List 1 = {56, 55, 30, 63}
Attention : Mod ne fonctionne qu'avec des valeurs entières, on peut passer par d'autres autres solutions
{56.5,-9,30.31,-1.8}->List 1
Mod(Int List 1,64)+Frac List 1->List 1
List 1 = {56.5, 55, 30.31, 63.8}
Les effets de particules :
Pour réaliser des effets de particules, il faut que chaques particules disposent de ses propres coordonnées en x et en y correspondant à deux List utilisables directement par le Drawstat. On les appelera List "X" et List "Y".
Il faut en plus définir la vitesse de chaque particule afin qu'elles soient totalement indépendantes, on appelera List "VX" et List "VY" les composantes selon x et y de la vitesse.
Il faut aussi connaître une fonction Basic : RanList#(N) (OPTN F6 F3 F4 F5) qui permet de créer une List remplie de N nombres aléatoires dans l'intervalle [0;1[
Sans cette fonction pas de système de particule réaliste !
On va créer un simple effet de particules qui tombent de l'écran
'Nombre de particules
10->N
ViewWindow 1,127,1,1,63,1
'Initialisation des coordonnées aléatoires sur tout l'écran
128xRanList#(N)->List "X"
63xRanList#(N)->List "Y"
'On garde que la partie entière pour pouvoir utiliser la fonction Mod
Int List "X"->List "X"
Int List "Y"->List "Y"
'Initialisation du Drawstat
S-Graph1 DrawOn,Scatter,List "X",List "Y",1,Dot
'Boucle principale
While 1
'On baisse toutes les particules de 3 pixels
List "Y"-3->List "Y"
'On remonte toutes celles en bas de l'écran
Mod(List "Y",64)->List "Y"
'On efface puis on affiche
Cls
Drawstat
WhileEnd
Et voilà !
Simple non ?
Maintenant l'effet n'est pas très beau, les particules tombent toutes à la même vitesse et ont toute la même trajectoire. On peut l'améliorer !
'Nombre de particules
10->N
ViewWindow 1,127,1,1,63,1
'Initialisation des coordonnées aléatoires sur tout l'écran
128xRanList#(N)->List "X"
63xRanList#(N)->List "Y"
'Initialsation de la vitesse
2x(RanList#(N)-0.5)->List "VX"
2xRanList#(N)->List "VY"
'Initialisation du Drawstat
S-Graph1 DrawOn,Scatter,List "X",List "Y",1,Dot
'Boucle principale
While 1
'Calcul des nouvelles coordonnées
List "X"+List "VX"->List "X"
List "Y"-2-List "VY"->List "Y"
'On replace toutes celles en dehors de l'écran
Mod(Int List "X",128)+Frac List "X"->List "X"
Mod(Int List "Y",64)+Frac List "Y"->List "Y"
'On efface puis on affiche
Cls
Drawstat
WhileEnd
L'effet est déja mieux !
Je vous mes en pièce jointe 4 programmes que j'ai fait :
-Des objets qui tombent, appuiez sur EXE pour les faire sauter, les Fleches pour fixer la limite.
-De la neige
-De la pluie
-Des éclairs
Ces programmes sont optimisés pour gagner un maximum de performance, je les ai commenté pour qu'ils soient plus compréhensible.
Fichier joint
Citer : Posté le 09/02/2013 13:32 | #
Ah, tu as enfin mis ton tuto !
En tout cas bravo, on comprend facilement !
Calculatrices : Graph 35+ USB tweakée et Classpad 330
Suivez moi et mon humour dévastateur ici focliquéla
Citer : Posté le 09/02/2013 16:34 | #
Sympathique, il peut même être utile en C pour des effets de particules... (pour peux qu'on le traduise, mais bon, la plus part des programmeurs n’orront pas trop de mal a le faire, je pense).
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 09/02/2013 18:44 | #
Je ressors mon vieux moteur de particules?
Citer : Posté le 09/02/2013 18:54 | #
Super tuto !
Et de qualité en plus
Citer : Posté le 09/02/2013 18:57 | #
Exellent tuto :
Citer : Posté le 09/02/2013 19:21 | #
Merci tout le monde
Citer : Posté le 09/02/2013 21:45 | #
Sympa comme tuto
Citer : Posté le 09/02/2013 23:52 | #
Je ressors mon vieux moteur de particules?
Je veux biens le voir
@Eiyeron:(c'est celui dans le DB, non?)
-en C:
-Un pong.
-Un projet en pause. Je compte le reprendre de temps en temps: Summer Cursed
-mon tuto sur les Str
Mes calto: G25+, G75
Mon minecraft en dévelopement
-Portal2D de JavierXD
-CalCraft de Wime
-GeekBros du groupe GeekBrothers (Eiyeron,Siapran,KevKevVTT,Adbook,LIMachi)
Citer : Posté le 11/02/2013 17:34 | #
J'avoue, je n'ai lu ton tutoriel, mais bel effort de présentation !
Vitesse des fonctions en Basic Casio | 7 days CPC | Casio Universal Wiki | Tutoriel Basic Casio
>>> Give me a click Brother <<< >>> Teste mon générateur de mots nouveaux <<<
>>> Random Youtube Video <<<
Citer : Posté le 12/02/2013 19:16 | #
Pas mal ce tuto.
Je souligne que le calcul listique est très utile lorsqu'on dessine des sprites
Citer : Posté le 13/02/2013 18:00 | #
Merci.
Oui on peut l'utiliser pour faire des symétriques, des zooms, et même des rotations !
Citer : Posté le 13/02/2013 19:11 | #
Pour les rotations c'est pratique effectivement. J'ai fait un petit code d'exemple sympa où on donne le nombre de côtés d'un polygone régulier et on peut le faire tourner. Si ça vous intéresse...