Feu de cheminée

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Feu de cheminée

Message par Flype »

Je vous partage un petit effet de feu pour la forme.

Image

Code : Tout sélectionner

;====================================
; Fire Effect, flype
;====================================

EnableExplicit

#W = 200
#H = 150
#Z = 2

Global Dim pix.l(#W+2, #H+2)

;====================================

Procedure FireEffect_Calc()
  Protected x, y
  For y = 0 To #H + 1
    For x = 1 To #W - 1
      pix(x, y) = (pix(x-1, y) + pix(x+1, y) + pix(x, y+1) + pix(x, y+1)) >> 2
    Next
  Next
EndProcedure

Procedure FireEffect_Draw()
  Protected x, y
  If StartDrawing(CanvasOutput(0))
    For y = 0 To #H - 1
      For x = 0 To #W - 1
        Box(x*#Z, y*#Z, #Z, #Z, pix(x, y))
      Next
    Next
    StopDrawing()
  EndIf
EndProcedure

Procedure FireEffect_Feed()
  Protected i
  ; Modifier le pas (step) pour modifier l'intensité du feu !
  For i = 0 To 255 Step 32
    pix(Random(#W, 0), #H+2) = i
  Next
EndProcedure

Procedure FireEffect_Update()
  FireEffect_Calc()
  FireEffect_Feed()
  FireEffect_Draw()
EndProcedure

;====================================

If OpenWindow(0, 0, 0, #W*#Z, #H*#Z, "Fire Effect", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, #W*#Z, #H*#Z)
  AddWindowTimer(0, 0, 5)
  BindEvent(#PB_Event_Timer, @FireEffect_Update(), 0, 0)
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

;====================================
Image
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Feu de cheminée

Message par nico »

:D , j'adore l'effet.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Feu de cheminée

Message par GallyHC »

Bonjour,

Vraiment sympa, je me suis permis "http://www.pbfrance.com/?url=source&cmd=viewer&val=78", si cela ne dérange pas.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Feu de cheminée

Message par Flype »

@gallyhc
Pas de souci :)

Il y a de quoi s'amuser avec çà - voici une variante :

- Clic gauche / Clic droit pour réinitialiser la "chambre de combustion" :lol:
- Mouvement de la souris pour dessiner dans le feu.
- Boostage du feu dans FireEffect_Feed() avec Min(i*3, 255).

Code : Tout sélectionner

 ... Code supprimé - voir post suivant ... 
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Feu de cheminée

Message par Flype »

Pour changer la couleur en vert par exemple,
modifier juste çà (bon ok un feu vert c'est chelou :lol: ) :

Code : Tout sélectionner

Box(x*#Z, y*#Z, #Z, #Z, pix(x, y))
par

Code : Tout sélectionner

Box(x*#Z, y*#Z, #Z, #Z, RGB(0,pix(x, y),0))
Image
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Feu de cheminée

Message par Flype »

Choix de couleurs assez sympa :

Image

Code : Tout sélectionner

;====================================
; Fire Effect, flype
;====================================

EnableExplicit

#W = 200
#H = 150
#Z = 2

Global pow = 30
Global Dim pix.l(#W+2, #H+2)

;====================================

Procedure Clamp(x, min, max)
  If x > max
    ProcedureReturn max
  EndIf
  If x < min
    ProcedureReturn min
  EndIf
  ProcedureReturn x
EndProcedure

Procedure FireEffect_Calc()
  Protected x, y
  For y = 0 To #H + 1
    For x = 1 To #W - 1
      pix(x, y) = (pix(x-1, y) + pix(x+1, y) + pix(x, y+1) + pix(x, y+1)) >> 2
    Next
  Next
EndProcedure

Procedure FireEffect_Clear(color)
  Protected x, y
  For y = 0 To #H + 2
    For x = 0 To #W + 2
      pix(x, y) = color
    Next
  Next
EndProcedure

Procedure FireEffect_Draw()
  Protected x, y
  If StartDrawing(CanvasOutput(0))
    For y = 0 To #H - 1
      For x = 0 To #W - 1
        Box(x*#Z, y*#Z, #Z, #Z, RGB(255, pix(x, y), 0))
      Next
    Next
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(10, 10, Str(pow), $00ffff)
    StopDrawing()
  EndIf
EndProcedure

Procedure FireEffect_Feed()
  Protected i
  For i = 0 To 5
   pix(Random(#W, 0), #H+2) = Clamp(Random(pow, 1)*2, 0, 255)
  Next
EndProcedure

Procedure FireEffect_FeedMouse(color)
  Protected x, y
  Protected md = Random(20, 0)
  Protected mx = ( WindowMouseX(0) + 1 ) / #Z
  Protected my = ( WindowMouseY(0) + 1 ) / #Z
  For y = -md To md
    For x = -md To md
      pix(Clamp(mx + x, 0, #W), #H+2) = color
    Next
  Next
EndProcedure

Procedure FireEffect_Pow()
  pow + ( 5 * GetGadgetAttribute(0, #PB_Canvas_WheelDelta) )
  pow = Clamp(pow, 1, 255)
EndProcedure

Procedure FireEffect_Update()
  FireEffect_Calc()
  FireEffect_Feed()
  FireEffect_Draw()
  FireEffect_FeedMouse(Random(200, 128))
EndProcedure

;====================================

If OpenWindow(0, 0, 0, #W*#Z, #H*#Z, "Fire Effect", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, #W*#Z, #H*#Z)
  FireEffect_Clear(0)
  Repeat
    Select WaitWindowEvent(1)
      Case #PB_Event_Gadget
        Select EventType()
          Case #PB_EventType_MouseWheel: FireEffect_Pow()
          Case #PB_EventType_LeftClick:  FireEffect_Clear(255)
          Case #PB_EventType_RightClick: FireEffect_Clear(0)
        EndSelect
      Case #PB_Event_CloseWindow
        Break
    EndSelect
    FireEffect_Update()
  ForEver
EndIf

;====================================
Image
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: Feu de cheminée

Message par Micheao »

ton code marche trés mal quand je lance ça marche que 2 secondes et j'ai l"erreur : en ligne 68 Index de tableau Hors limite
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Feu de cheminée

Message par Flype »

Exact merci, j'avais zappé un truc - corrigé dans code ci-dessus - et désactive le debugger c'est gourmand.
Image
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Feu de cheminée

Message par nico »

J'ai une erreur en ligne 59, min ne peur être supérieur à max.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Feu de cheminée

Message par Flype »

@Nico

"min ne peut être supérieur à max" ? :?

Tu utilises quelle version de PB ?
Perso, je suis sous 5.41 LTS (x64) Linux.
C'est comme si tu avais une userlib avec les fonctions Min et Max déjà implémentées.
Essayes de changer Min en Min2.
Image
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Feu de cheminée

Message par nico »

PureBasic 5.41 x64, même en changeant min par min2, j'ai toujours la même erreur, pareil sur 5.41 x86.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Feu de cheminée

Message par Flype »

Ah ok j'ai compris - c'était dans la fonction random() - désolé.

Corrigé dans code précédent.

Je ne sais pas pour vous mais je viens de tester sous Windows et çà rame - çà vient peut-être du pauvre CPU de mon portable mais tout de même.

EDIT: Non çà ne vient pas du CPU mais du Timer qui ne réagit pas du tout pareil que sur mon Linux.

Si vous trouvez que çà rame - déplacez l'appel à la fonction FireEffect_Update() juste avant ForEver tout en bas du code, désactivez le timer et mettre WaitWindowEvent(1), bizarre quand même.
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Feu de cheminée

Message par Flype »

Ah bah oui, je ne savais pas qu'on pouvait faire du feu vert et même violet, merci pour la vidéo.
Image
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Feu de cheminée

Message par nico »

Ok, c'est bon.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Feu de cheminée

Message par Flype »

cool
Image
Répondre