Espace TI: Forum
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le deal à ne pas rater :
Cartes Pokémon 151 : où trouver le coffret Collection Alakazam-ex ?
Voir le deal

[Axe] Automates cellulaires 2 : le feu

3 participants

Aller en bas

[Axe] Automates cellulaires 2 : le feu Empty [Axe] Automates cellulaires 2 : le feu

Message par matrefeytontias Ven 9 Mar - 9:36

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 :
  • 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
  • Et ce, pour tous les pixels composant l'aire à "brûler"


Alors allons-y, appliquons dans la joie Très Content !

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
Alors à voir comme ça, ça doit pas vous inspirer grand chose, mais si vous essayez de l'afficher comme un sprite, vous aurez vu que chaque ligne a un pixel éteint pour 7 allumés. Et bien c'est ça, c'est le masque qu'on va appliquer à L3 ou L6.

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
C'est tout ! Pas compliqué, si ?

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
matrefeytontias
Platinum 1
Platinum 1

Sexe : Masculin
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
Calculatrices :
  • - TI-83+.fr
  • - TI-Nspire CAS

TI-83+.fr


Revenir en haut Aller en bas

[Axe] Automates cellulaires 2 : le feu Empty Re: [Axe] Automates cellulaires 2 : le feu

Message par persalteas Ven 9 Mar - 12:14

Le principe ici est simple :
.

Pour une fois que c'est vrai Gni

J'ai compris pour une fois, je suis content !!

Good Job, sir.
persalteas
persalteas
Platinum 2
Platinum 2

Sexe : Masculin
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
Calculatrices :
  • - TI-82 Stats.fr
  • - TI-83
  • - TI-83+
  • - TI-84+ SE
  • - TI-86
  • - TI-Nspire
  • - TI-Nspire CX
  • - Casio Collège
  • - Casio Graph

TI-84 Pocket.fr


http://tiemulation.kegtux.org

Revenir en haut Aller en bas

[Axe] Automates cellulaires 2 : le feu Empty Re: [Axe] Automates cellulaires 2 : le feu

Message par matrefeytontias Ven 9 Mar - 12:16

Comment ça "pour une fois que c'est vrai" ? T'as pas compris les explosions ? Si non bah demande ! ^^
matrefeytontias
matrefeytontias
Platinum 1
Platinum 1

Sexe : Masculin
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
Calculatrices :
  • - TI-83+.fr
  • - TI-Nspire CAS

TI-83+.fr


Revenir en haut Aller en bas

[Axe] Automates cellulaires 2 : le feu Empty Re: [Axe] Automates cellulaires 2 : le feu

Message par persalteas Ven 9 Mar - 12:51

Non, les explosions je l'ai même pas testé. Langue

Mais tout le monde dit toujours que le principe est simple.

ah non, pas dans ton tuto d'hexadécimal...enfin pas partout Langue
persalteas
persalteas
Platinum 2
Platinum 2

Sexe : Masculin
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
Calculatrices :
  • - TI-82 Stats.fr
  • - TI-83
  • - TI-83+
  • - TI-84+ SE
  • - TI-86
  • - TI-Nspire
  • - TI-Nspire CX
  • - Casio Collège
  • - Casio Graph

TI-84 Pocket.fr


http://tiemulation.kegtux.org

Revenir en haut Aller en bas

[Axe] Automates cellulaires 2 : le feu Empty Re: [Axe] Automates cellulaires 2 : le feu

Message par matrefeytontias Ven 9 Mar - 12:54

Bah non, la version du feu avec masking c'est pas vraiment simple, pour expliquer j'ai galéré ^^
matrefeytontias
matrefeytontias
Platinum 1
Platinum 1

Sexe : Masculin
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
Calculatrices :
  • - TI-83+.fr
  • - TI-Nspire CAS

TI-83+.fr


Revenir en haut Aller en bas

[Axe] Automates cellulaires 2 : le feu Empty Re: [Axe] Automates cellulaires 2 : le feu

Message par noelthebest Dim 11 Mar - 15:23

C'est plus simple que l'explosion je trouve. Mais bon, les deux sont simple vu comme t'expliques bien. ^^
noelthebest
noelthebest
Platinum 1
Platinum 1

Sexe : Masculin
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
Calculatrices :
  • - TI-83+.fr
  • - TI-Nspire CX
  • - Casio Collège
  • - Casio Graph

TI-84+ SE


Revenir en haut Aller en bas

[Axe] Automates cellulaires 2 : le feu Empty Re: [Axe] Automates cellulaires 2 : le feu

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum