[Axe] Automates cellulaires 2 : le feu
3 participants
Page 1 sur 1
[Axe] Automates cellulaires 2 : le feu
Salut les gens !
Cette fois-ci, avec les automates cellulaires nous allons simuler du feu !
Brûler un endroit précis de l'écran
Le principe
Le principe ici est simple :Et ce, pour tous les pixels composant l'aire à "brûler"
Alors allons-y, appliquons dans la joie !
Application
On a donc (bien sûr) notre boucle-conteneur, un sprite et ses coordonnées.
Et on a juste à appliquer les étapes bêtement ! Que diriez-vous de faire brûler la ligne du sommet de notre sprite ?
Résultat :
[Vous devez être inscrit et connecté pour voir cette image]
Cette méthode a pourtant quelques inconvénients : elle est lente (oooh si, pas tant les boucles For que les routines agissant sur les pixels) et la flamme risque de donner des résultats indésirables si le sprite à brûler se déplace. C'est pour pallier à tout ça qu'on va utiliser une autre méthode !
Brûler tout(e une partie de) l'écran
Le principe
Là, c'est légèrement plus compliqué : on va utiliser deux des aires de RAM pour faire brûler tout ça. L6 si on utilise le buffer, ou L3 pour le back-buffer.
On va donc avoir nos aires libres (qui sont une suite de 768 octets avec un octet = 8 pixels, un par bit) et on va les masquer : c'est à dire leur appliquer un masque dont le but est, comme son nom l'indique, modifier son apparence.
Ce masque, je vous le donne tout de suite, le voici :
Que fait ce masque ? Hé bien il va petit à petit éteindre chaque pixel d'une ligne de 8, ou mettre à 0 chaque bit d'un octet, jusqu'à ce que tout soit éteint / désactivé. En plus de ça, on va copier notre octet sur l'octet au-dessus pour simuler une flamme.
Nous allons appliquer notre masque avec la commande AND.
Application
Allons-y tout de go, on a toutes les clés en main :
MAIS on a oublié quelque chose ! Pour brûler, le feu doit avoir une base, un combustible !
Résultat :
[Vous devez être inscrit et connecté pour voir cette image]
Cette fois-ci, chaque particule flambante est indépendante, on peut donc remplacer la ligne par un sprite, qu'on pourra déplacer ! Je vous laisse le loisir d'essayer, mais sachez juste que tout ce qui se trouvera à l'écran lors de l'exécution de la boucle For va brûler ! Donc si vous voulez tout cramer sauf un seul sprite, veillez à l'afficher après la boucle et à l'effacer avant (avec Pt-Change par exemple).
Sachez aussi que si vous remplacez L6 par L3 et DispGraph par DispGraphr, vous aurez du feu en grayscales puisque c'est le back-buffer que vous manipulez !
Autre astuce : remplacez le code précédent par celui-ci :
Et vous aurez du feu blanc sur un fond noir ! Essayez pour voir !
Cet effet peut très bien rendre sur un menu, ou même une animation où tout brûle à l'écran ! Vous pouvez aussi changer la zone qui brûle en manipulant les 2 valeurs de la boucle For !
Faites bon usage de cet effet, et bonne programmation !
Cette fois-ci, avec les automates cellulaires nous allons simuler du feu !
Brûler un endroit précis de l'écran
Le principe
Le principe ici est simple :
- On teste si un pixel est allumé
- Dans tous les cas, on éteint le pixel au-dessus
- Si oui, on tire un nombre aléatoire entre 0 et une valeur au choix, et s'il est différent de 0 on rallume le pixel au-dessus
- Si non on laisse éteint le pixel du dessus
Alors allons-y, appliquons dans la joie !
Application
On a donc (bien sûr) notre boucle-conteneur, un sprite et ses coordonnées.
- Code:
:.FIRE
:
:[FFFFFFFFFFFFFFFF→Pic1
:28→Y+16→X
:
:Repeat getKey(15)
:
:End
Et on a juste à appliquer les étapes bêtement ! Que diriez-vous de faire brûler la ligne du sommet de notre sprite ?
- Code:
:.FIRE
:
:[FFFFFFFFFFFFFFFF→Pic1
:28→Y+16→X
:
:Repeat getKey(15)
: Pt-On(X,Y,Pic1
:
: For(A,X,X+7)
: .Pour une flamme de 14 pixels de haut
: For(B,Y-14,Y)
: Pxl-Off(A,B-1 → Règle 1
: If pxl-Test(A,B
: If rand^6 → Règle 2
: Pxl-On(A,B-1
: End → Règle 3
: End
: End
: End
:
: DispGraph
:End
Résultat :
[Vous devez être inscrit et connecté pour voir cette image]
Cette méthode a pourtant quelques inconvénients : elle est lente (oooh si, pas tant les boucles For que les routines agissant sur les pixels) et la flamme risque de donner des résultats indésirables si le sprite à brûler se déplace. C'est pour pallier à tout ça qu'on va utiliser une autre méthode !
Brûler tout(e une partie de) l'écran
Le principe
Là, c'est légèrement plus compliqué : on va utiliser deux des aires de RAM pour faire brûler tout ça. L6 si on utilise le buffer, ou L3 pour le back-buffer.
On va donc avoir nos aires libres (qui sont une suite de 768 octets avec un octet = 8 pixels, un par bit) et on va les masquer : c'est à dire leur appliquer un masque dont le but est, comme son nom l'indique, modifier son apparence.
Ce masque, je vous le donne tout de suite, le voici :
- Code:
[7FBFDFEFF7FBFDFE→Str1
Que fait ce masque ? Hé bien il va petit à petit éteindre chaque pixel d'une ligne de 8, ou mettre à 0 chaque bit d'un octet, jusqu'à ce que tout soit éteint / désactivé. En plus de ça, on va copier notre octet sur l'octet au-dessus pour simuler une flamme.
Nous allons appliquer notre masque avec la commande AND.
Application
Allons-y tout de go, on a toutes les clés en main :
- Code:
:.FIRE2
:[7FBFDFEFF7FBFDFE→Str1
:
:Repeat getKey(15)
:.Tous les pixels de l'écran
:For(A,0,767)
:{A+L6} and {rand^8+Str1}→{A-12+L6}
:Il y a 12 octets sur une ligne (96 / 8), donc l'octet du dessus est A - 12
:End
:DispGraph
:End
MAIS on a oublié quelque chose ! Pour brûler, le feu doit avoir une base, un combustible !
- Code:
:.FIRE2
:[7FBFDFEFF7FBFDFE→Str1
:
:.On rajoute la ligne qui va brûler
:Line(0,63,95,63
:Repeat getKey(15)
:.Tous les pixels de l'écran
:For(A,0,767)
:{A+L6} and {rand^8+Str1}→{A-12+L6}
:Il y a 12 octets sur une ligne (96 / 8), donc l'octet du dessus est A - 12
:End
:DispGraph
:End
Résultat :
[Vous devez être inscrit et connecté pour voir cette image]
Cette fois-ci, chaque particule flambante est indépendante, on peut donc remplacer la ligne par un sprite, qu'on pourra déplacer ! Je vous laisse le loisir d'essayer, mais sachez juste que tout ce qui se trouvera à l'écran lors de l'exécution de la boucle For va brûler ! Donc si vous voulez tout cramer sauf un seul sprite, veillez à l'afficher après la boucle et à l'effacer avant (avec Pt-Change par exemple).
Sachez aussi que si vous remplacez L6 par L3 et DispGraph par DispGraphr, vous aurez du feu en grayscales puisque c'est le back-buffer que vous manipulez !
Autre astuce : remplacez le code précédent par celui-ci :
- Code:
:.FIRE2
:[8040201008040201→Str1
:
:.On rajoute la ligne qui va brûler
:Line(0,63,95,63
:.On inverse l'écran
:DrawInv
:Repeat getKey(15)
:.Tous les pixels de l'écran
:For(A,0,767)
:{A+L6} or {rand^8+Str1}→{A-12+L6}
:Il y a 12 octets sur une ligne (96 / 8), donc l'octet du dessus est A - 12
:End
:DispGraph
:End
Et vous aurez du feu blanc sur un fond noir ! Essayez pour voir !
Cet effet peut très bien rendre sur un menu, ou même une animation où tout brûle à l'écran ! Vous pouvez aussi changer la zone qui brûle en manipulant les 2 valeurs de la boucle For !
Faites bon usage de cet effet, et bonne programmation !
matrefeytontias- Platinum 1
- Sexe :
Age : 26
Messages : 1383
Date d'inscription : 28/09/2011
Etudes : 1ère S SI
Points Forum : 90
Points Concours : 7
Langages :- - ASM TI-82 Stats / TI-83
- - ASM TI-83+ / TI-84+
- - Axe Parser
- - Lua Nspire
- - Ndless Nspire
- - TI-83+.fr
- - TI-Nspire CAS
Re: [Axe] Automates cellulaires 2 : le feu
.Le principe ici est simple :
Pour une fois que c'est vrai
J'ai compris pour une fois, je suis content !!
Good Job, sir.
persalteas- Platinum 2
- Sexe :
Age : 28
Messages : 2068
Date d'inscription : 30/06/2010
Etudes : PACES (médecine)
Points Forum : 114
Points Concours : 10
Langages :- - TI-Basic Z80
- - xLib
- - Grammer
- - TI-Basic Nspire
- - TI-82 Stats.fr
- - TI-83
- - TI-83+
- - TI-84+ SE
- - TI-86
- - TI-Nspire
- - TI-Nspire CX
- - Casio Collège
- - Casio Graph
Re: [Axe] Automates cellulaires 2 : le feu
Comment ça "pour une fois que c'est vrai" ? T'as pas compris les explosions ? Si non bah demande !
matrefeytontias- Platinum 1
- Sexe :
Age : 26
Messages : 1383
Date d'inscription : 28/09/2011
Etudes : 1ère S SI
Points Forum : 90
Points Concours : 7
Langages :- - ASM TI-82 Stats / TI-83
- - ASM TI-83+ / TI-84+
- - Axe Parser
- - Lua Nspire
- - Ndless Nspire
- - TI-83+.fr
- - TI-Nspire CAS
Re: [Axe] Automates cellulaires 2 : le feu
Non, les explosions je l'ai même pas testé.
Mais tout le monde dit toujours que le principe est simple.
ah non, pas dans ton tuto d'hexadécimal...enfin pas partout
Mais tout le monde dit toujours que le principe est simple.
ah non, pas dans ton tuto d'hexadécimal...enfin pas partout
persalteas- Platinum 2
- Sexe :
Age : 28
Messages : 2068
Date d'inscription : 30/06/2010
Etudes : PACES (médecine)
Points Forum : 114
Points Concours : 10
Langages :- - TI-Basic Z80
- - xLib
- - Grammer
- - TI-Basic Nspire
- - TI-82 Stats.fr
- - TI-83
- - TI-83+
- - TI-84+ SE
- - TI-86
- - TI-Nspire
- - TI-Nspire CX
- - Casio Collège
- - Casio Graph
Re: [Axe] Automates cellulaires 2 : le feu
Bah non, la version du feu avec masking c'est pas vraiment simple, pour expliquer j'ai galéré
matrefeytontias- Platinum 1
- Sexe :
Age : 26
Messages : 1383
Date d'inscription : 28/09/2011
Etudes : 1ère S SI
Points Forum : 90
Points Concours : 7
Langages :- - ASM TI-82 Stats / TI-83
- - ASM TI-83+ / TI-84+
- - Axe Parser
- - Lua Nspire
- - Ndless Nspire
- - TI-83+.fr
- - TI-Nspire CAS
Re: [Axe] Automates cellulaires 2 : le feu
C'est plus simple que l'explosion je trouve. Mais bon, les deux sont simple vu comme t'expliques bien.
noelthebest- Platinum 1
- Sexe :
Age : 26
Messages : 1971
Date d'inscription : 12/03/2011
Etudes : ENS Cachan
Points Forum : 20
Points Concours : 9
Langages :- - TI-Basic Z80
- - ASM TI-83+ / TI-84+
- - Axe Parser
- - TI-83+.fr
- - TI-Nspire CX
- - Casio Collège
- - Casio Graph
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|