Physique des Fluides ......

Programmation avancée de jeux en PureBasic
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Physique des Fluides ......

Message par Mytic »

J’étais entrain d’améliorer le moteur de Route, et je suis vite passer à l’Eau. :lol:
Voici un moteur qui gère la physique du liquide (le minimum).
Dessinez sur l’écran les obstacles avec le bouton gauche de la souris.
Et avec le bouton droit vous injecter l’eau.
Espace pour changer le mode de dessin en gomme et vis versa.
Appuyez sur la touche ENTRER pour générer un labyrinthe.
Echape (à vous de deviner)

:D

Image

Code : Tout sélectionner

;-------------
;-By Mytic ---
;-------------
;------------------(Physique des fluides 6.5)

InitSprite()
;InitScreen() ;----(Inutile pour les nouvelles versions )
InitMouse()
InitKeyboard()

Structure info
x.l
y.l
acc.D
coul.l
activ.l
mov.l
ina.l
EndStructure

;Global FPS()
Global Dim goute.info(9999)
Global Dim Bgoute.info(9999)
Global maxg.l = -1
Global limg.l = 9999
Global G.D = 0.1,maxacc.d = 4
Global pa.l = 255
Global activ.l = 0

Procedure.s FPS()
Static newtime.d,bactime.d,fp.l,rfp.s
newtime = ElapsedMilliseconds()
If newtime - bactime => 1000
rfp = Str(fp)
fp = 0
bactime = newtime
Else
fp = fp + 1
EndIf
ProcedureReturn rfp
EndProcedure

Procedure mega_Point(x,Y)   
UseBuffer(0) 
    color= PeekW(DrawingBuffer() + (x * 2) +DrawingBufferPitch()* ( Y )  )
UseBuffer(-1)
    ProcedureReturn color
EndProcedure



Procedure mega_Plot(x,Y,Couleur)
UseBuffer(0)
    PokeW( DrawingBuffer()  + (x * 2) +DrawingBufferPitch()* ( Y ) , Couleur )
UseBuffer(-1)
EndProcedure 

Procedure mega_BOX(x,Y,w.l,h.l,Couleur)
UseBuffer(-1)
For ny = y To y+h-2
For nx = x To x+w-2
    PokeW( DrawingBuffer()  + (nx * 2) +DrawingBufferPitch()* ( nY ) , Couleur )
Next nx
Next ny

EndProcedure 

Procedure labi(maxlX.l,minlY.l,grosso.l,couleur.l)
#taille = 13
For y = 1 To minlY-1 Step #taille
For x = 1 To maxlX-1 Step #taille
ax = Random(1)
If ax <> 0
For i = 0 To grosso
LineXY(x,y+i,x+#taille,y+i,couleur)
Next i

EndIf
Next x
Next y
For x = 1 To maxlX-1 Step #taille
For y = 1 To minlY-1 Step #taille
ay = Random(1)
If ay <> 0
For i = 0 To grosso
LineXY(x+i,y,x+i,y+#taille,couleur)
Next i
EndIf
Next y
Next x
EndProcedure


Procedure init_goute()
For i = 0 To limg
goute(i)\x = 1
goute(i)\y = 1
goute(i)\activ = 0
vv = Random(150)
goute(i)\coul = RGB(vv,vv,220 + Random(30))
Next i
EndProcedure

Procedure nouvel_goute(x.l,y.l)
For i = 0 To maxg
If goute(i)\activ = 0
goute(i)\acc = 1
goute(i)\x = x
goute(i)\y = y
goute(i)\activ = 1
vv = Random(150)
goute(i)\coul = RGB(vv,vv,220 + Random(30))
ProcedureReturn 1
EndIf
Next i
If maxg <= limg
maxg = maxg + 1
goute(maxg)\acc = 1
goute(maxg)\x = x
goute(maxg)\y = y
goute(maxg)\activ = 1
vv = Random(150)
goute(maxg)\coul = RGB(vv,vv,220 + Random(30))
ProcedureReturn 1
EndIf
ProcedureReturn 0
EndProcedure

Procedure gravite_collision()
activ = 0
StartDrawing(SpriteOutput(0))
For i = 0 To maxg
If goute(i)\activ = 1
activ+1
;=================(effet bulles de savon)
;If mega_Point(goute(i)\x,goute(i)\y)<> 0  
;goute(i)\y-1
;EndIf
If mega_Point(goute(i)\x,goute(i)\y+goute(i)\acc) = 0
goute(i)\y+goute(i)\acc
If goute(i)\acc < maxacc
goute(i)\acc+G
EndIf
;goute(i)\ina-1
Else
goute(i)\acc=1
p = Random(1)
If p = 1
If mega_Point(goute(i)\x+1,goute(i)\y)= 0
goute(i)\x+1
Else
If mega_Point(goute(i)\x-1,goute(i)\y)= 0 :goute(i)\x-1:EndIf
EndIf
Else
If mega_Point(goute(i)\x-1,goute(i)\y)= 0
goute(i)\x-1
Else
If mega_Point(goute(i)\x+1,goute(i)\y)= 0 :goute(i)\x+1:EndIf
EndIf
EndIf


If mega_Point(goute(i)\x,goute(i)\y+1)<> 0 And  mega_Point(goute(i)\x,goute(i)\y-1)= 0
If mega_Point(goute(i)\x-1,goute(i)\y+1)<> 0 And mega_Point(goute(i)\x+1,goute(i)\y+1)<> 0
goute(i)\y-1
;goute(i)\y-goute(i)\acc
EndIf
EndIf

EndIf

If (goute(i)\x > 10) And (goute(i)\x < 630) And (goute(i)\y > 10) And (goute(i)\y < 470)
vv = Random(150)
goute(i)\coul = RGB(vv,vv,220 + Random(30))
mega_Plot(Bgoute(i)\x,Bgoute(i)\y,0)
mega_Plot(goute(i)\x,goute(i)\y,goute(i)\coul)
Bgoute(i)\x = goute(i)\x
Bgoute(i)\y = goute(i)\y
Else
activ-1
mega_Plot(Bgoute(i)\x,Bgoute(i)\y,0)
goute(i)\activ = 0
EndIf

EndIf
Next i

DrawText(10,10,"Gouttes actives : " + Str(activ)+"#" + FPS() + "#" ,53289)
StopDrawing()

EndProcedure


Procedure type_goute()
StartDrawing(ScreenOutput())
For i = 0 To maxg
If goute(i)\activ = 1
;Box(Bgoute(i)\x,Bgoute(i)\y,2,2,0)
Box(goute(i)\x,goute(i)\y,2,2+goute(i)\acc/maxacc+1,goute(i)\coul)
;mega_BOX(goute(i)\x,goute(i)\y,2,2+goute(i)\acc/maxacc+1,goute(i)\coul)
EndIf
Next i
StopDrawing()
EndProcedure
;OpenWindow(0,0,0,500,500,"test")
;OpenWindowedScreen(WindowID(0),0,0,500,500,0,0,0)
OpenScreen(640,480,16,"Eau")
CreateSprite(0,500,500)
CreateSprite(1,10,10)
StartDrawing(SpriteOutput(1))
LineXY(0,5,10,5,RGB(0,255,0))
LineXY(5,0,5,10,RGB(0,255,0))
StopDrawing()
FlipBuffers()


init_goute()
Repeat
ClearScreen(0)
ExamineKeyboard()
ExamineMouse()

If KeyboardReleased(#PB_Key_Return)
UseBuffer(0)
ClearScreen(0)
StartDrawing(SpriteOutput(0))
labi(640,480,3,255)
StopDrawing()
UseBuffer(-1)
EndIf

If KeyboardPushed(#PB_Key_Escape)
End
EndIf
If KeyboardReleased(#PB_Key_Space)
If pa = 0
pa = 255
Else
pa = 0
EndIf
EndIf
x = MouseX()
y = MouseY()
If MouseButton(#PB_MouseButton_Left)
StartDrawing(SpriteOutput(0))
Circle(x,y,3,pa)
;mega_Plot(x,y,255)
StopDrawing()
EndIf

If MouseButton(#PB_MouseButton_Right)
nouvel_goute(x,y)
EndIf

DisplaySprite(0,0,0)
DisplayTransparentSprite(1,x-5,y-5)
gravite_collision()
type_goute()
;event = WindowEvent()
Delay(1)
FlipBuffers()
ForEver
End 
Dernière modification par Mytic le mer. 03/oct./2007 0:22, modifié 9 fois.
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Image
:D
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Image
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Marche pas chez moi, mais ça à l'air pas mal.

Initscreen() ça n'existe pas chez moi dans PB, bizar 8O (version beta 3 de 4.10)
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Tu peu la supprimé elle ne sert à rien, c’est qu’un réflex chez moi :lol:
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Je sais bien que le Code peu encore être amélioré, et c’est ce que je suis entrain de faire…
La nouvelle version sera postée le soir si tout ce passe bien
:!:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Mytic a écrit :Je sais bien que le Code peu encore être amélioré, et c’est ce que je suis entrain de faire…
La nouvelle version sera postée le soir si tout ce passe bien
:!:
chapeau bas, je trouve cela extra !! :D

c'est vraiment fort !! :D bravo grand chef !! :)
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

@Mytic

Ce qui est fort, c'est la taille de tes codes !
Je savais pas qu'on pouvait faire autant avec si peu de lignes!

BRAVO!

PS:

Code : Tout sélectionner

event = WindowEvent() 
doit être supprimé pour que ça marche chez moi (c'est un "reste" de ton écran fenêtré)
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Merci...
J’ai amélioré le code, et j’ai ajouté un effet de brillance dans l’eau.
:)
J’ai posté le code à la place du premier.

:idea:
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

C'est du propre !

Par contre, mon petit 1 ghz a un petit peu.

En attendant, félicitations! Tu ne manques pas d'imagination!
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Un screenshoot du nouveau moteur…
:D
Image
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Manque plus qu'une gomme mdr
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

@wolfjeremy
Avec Espace tu bascules en mode gomme ou dessin !
Dernière modification par Mytic le ven. 28/sept./2007 22:37, modifié 1 fois.
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Ha lol désolé
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Ma contribution lol :

Image
Répondre