π
<-
Chat plein-écran
[^]

[Axe] Automates cellulaires II : Le feu

Regroupement de tous les tutoriaux z80 (82/83/84)

[Axe] Automates cellulaires II : Le feu

Message non lude Persalteas » 07 Mai 2013, 12:51

CE POST EST UN ENTIER PLAGIAT De CELUI DE MATREF ICI. Mon seul mérite est la traduction HTML>BBCode.


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 :] !

Application

On a donc (bien sûr) notre boucle-conteneur, un sprite et ses coordonnées.
Code: Tout sélectionner
:.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: Tout sélectionner
:.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 :

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: Tout sélectionner
[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: Tout sélectionner
:.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: Tout sélectionner
:.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 :

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 <b>tout ce qui se trouvera à l'écran lors de l'exécution de la boucle For va brûler !</b> 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: Tout sélectionner
:.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 !
Avatar de l’utilisateur
PersalteasMembre UPECS
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 6.2%
 
Messages: 2337
Images: 113
Inscription: 04 Fév 2010, 00:00
Localisation: Evry (France)
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: PhD candidate, Bioinformatics

Re: [Axe] Automates cellulaires II : Le feu

Message non lude Hayleia » 07 Mai 2013, 16:25

Persalteas a écrit:CE POST EST UN ENTIER PLAGIAT De CELUI DE MATREF ICI.

:quest:
Et celui de Matref est un plagiat total de celui de Builderboy ?

Persalteas a écrit:pallier à

ERR: Syntax

Et à part ça, c'est vrai que les flammes c'est beau à voir, mais cet effet a tellement été utilisé inutilement dans plein de jeux plus ou moins biens que les gens commencent à s'en lasser. Mais c'est toujours bien de comprendre comment le truc marche pour pouvoir en refaire d'autres en tout cas ;)

Image
ImageImageImage
Pokemon Topaze (Axe) discussion and download links here
(19:29:36) noelnadal: plus sérieusemen​t, j'ai très peu de problèmes
(22:45:44) Clifward: J'aime rire du malheur des autres :troll:

(2017.11.18 - 17:07:12) Fireworks: Hayleia !!!!!
(2017.11.18 - 17:07:19) TI-Bot: Fireworks has been logged out (Kicked).
(2017.11.18 - 17:07:22) TI-Bot: Ban of user Fireworks revoked.
(2017.11.18 - 17:07:25) TI-Bot: Fireworks logs into the Chat.
(2017.11.18 - 17:07:28) Fireworks: <3
(2017.11.18 - 17:07:31) Fireworks: 208
Avatar de l’utilisateur
HayleiaGénéreux
Niveau 17: GM (Grand Maître des calculatrices)
Niveau 17: GM (Grand Maître des calculatrices)
Prochain niv.: 43.8%
 
Messages: 2509
Images: 2
Inscription: 30 Aoû 2011, 08:22
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile
Classe: Templar

Re: [Axe] Automates cellulaires II : Le feu

Message non lude Excale » 07 Mai 2013, 16:27

Mhh.... en quoi c'est un automate cellulaire ça?

EDIT: Moui, si on considère que rand() est une "règle"...
Avatar de l’utilisateur
ExcaleAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 3.9%
 
Messages: 2955
Images: 3
Inscription: 10 Sep 2010, 00:00
Genre: Homme
Calculatrice(s):
MyCalcs profile

Re: [Axe] Automates cellulaires II : Le feu

Message non lude Hayleia » 07 Mai 2013, 16:29

Ben t'as un tas de pixels et ce tas doit évoluer selon un certain nombre de règles. Donc si le Jeu de la Vie est un automate cellulaire, ce feu en est un aussi, il suit juste d'autres règles.

Image
ImageImageImage
Pokemon Topaze (Axe) discussion and download links here
(19:29:36) noelnadal: plus sérieusemen​t, j'ai très peu de problèmes
(22:45:44) Clifward: J'aime rire du malheur des autres :troll:

(2017.11.18 - 17:07:12) Fireworks: Hayleia !!!!!
(2017.11.18 - 17:07:19) TI-Bot: Fireworks has been logged out (Kicked).
(2017.11.18 - 17:07:22) TI-Bot: Ban of user Fireworks revoked.
(2017.11.18 - 17:07:25) TI-Bot: Fireworks logs into the Chat.
(2017.11.18 - 17:07:28) Fireworks: <3
(2017.11.18 - 17:07:31) Fireworks: 208
Avatar de l’utilisateur
HayleiaGénéreux
Niveau 17: GM (Grand Maître des calculatrices)
Niveau 17: GM (Grand Maître des calculatrices)
Prochain niv.: 43.8%
 
Messages: 2509
Images: 2
Inscription: 30 Aoû 2011, 08:22
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile
Classe: Templar

Re: [Axe] Automates cellulaires II : Le feu

Message non lude Excale » 07 Mai 2013, 16:30

Ce qui me gène, c'est que rand() soit considéré comme un règle. Je ne vois pas la moindre trace de cela dans les automates cellulaires que je peux trouver sur wikipedia.
Avatar de l’utilisateur
ExcaleAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 3.9%
 
Messages: 2955
Images: 3
Inscription: 10 Sep 2010, 00:00
Genre: Homme
Calculatrice(s):
MyCalcs profile

Re: [Axe] Automates cellulaires II : Le feu

Message non lude Hayleia » 07 Mai 2013, 16:33

Excale a écrit:Ce qui me gène, c'est que rand() soit considéré comme un règle. Je ne vois pas la moindre trace de cela dans les automates cellulaires que je peux trouver sur wikipedia.

Ah. Je savais pas que les automates cellulaires ne pouvaient pas avoir de règles dépendant de l'aléatoire. Bon, ben c'est un automate cellulaire approché, par opposition aux automates cellulaires rigoureux :P

Image
ImageImageImage
Pokemon Topaze (Axe) discussion and download links here
(19:29:36) noelnadal: plus sérieusemen​t, j'ai très peu de problèmes
(22:45:44) Clifward: J'aime rire du malheur des autres :troll:

(2017.11.18 - 17:07:12) Fireworks: Hayleia !!!!!
(2017.11.18 - 17:07:19) TI-Bot: Fireworks has been logged out (Kicked).
(2017.11.18 - 17:07:22) TI-Bot: Ban of user Fireworks revoked.
(2017.11.18 - 17:07:25) TI-Bot: Fireworks logs into the Chat.
(2017.11.18 - 17:07:28) Fireworks: <3
(2017.11.18 - 17:07:31) Fireworks: 208
Avatar de l’utilisateur
HayleiaGénéreux
Niveau 17: GM (Grand Maître des calculatrices)
Niveau 17: GM (Grand Maître des calculatrices)
Prochain niv.: 43.8%
 
Messages: 2509
Images: 2
Inscription: 30 Aoû 2011, 08:22
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile
Classe: Templar


Retourner vers Tutoriaux

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 5 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1429 utilisateurs:
>1387 invités
>38 membres
>4 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)