[PB 5.10b2] - Explosions + Physique
Publié : lun. 14/janv./2013 17:09
Salut à tous!
Voici un petit bout de code permettant de "simuler" grossièrement une explosion avec le moteur physique de PB (juste la physique, pas le côté graphique).
En bref, ça crée une sphère qui grandit progressivement en repoussant les objets alentours comme le ferait le souffle d'une explosion. Très sommaire, mais pour un jeu d'arcade ça peut suffire.
Au moment de la création de l'explosion, on spécifie la taille finale de l'explosion et le temps qu'elle mettra pour atteindre cette taille.
Bougez la petite sphère blanche avec la souris, clic gauche pour déclencher l'explosion.
Remarques:
- En passant en 5.10, j'ai perdu les ombres des objets
. Quelqu'un sait pourquoi ?
- Le code plante en 5.10b3 sur le ResizeEntity (Invalid Memory Access) => j'essaierai de faire un rapport de bug sur le forum anglais.
A+
Voici un petit bout de code permettant de "simuler" grossièrement une explosion avec le moteur physique de PB (juste la physique, pas le côté graphique).
En bref, ça crée une sphère qui grandit progressivement en repoussant les objets alentours comme le ferait le souffle d'une explosion. Très sommaire, mais pour un jeu d'arcade ça peut suffire.
Au moment de la création de l'explosion, on spécifie la taille finale de l'explosion et le temps qu'elle mettra pour atteindre cette taille.
Bougez la petite sphère blanche avec la souris, clic gauche pour déclencher l'explosion.
Remarques:
- En passant en 5.10, j'ai perdu les ombres des objets

- Le code plante en 5.10b3 sur le ResizeEntity (Invalid Memory Access) => j'essaierai de faire un rapport de bug sur le forum anglais.
A+
Code : Tout sélectionner
;- Press "W" to toggle wireframe display
;- Press "P" to toggle physics bodies display
; Window size
#SCREENWIDTH = 800
#SCREENHEIGHT = 500
Structure explo_struct
x.f
y.f
z.f
entity.i
size.f
sizeMax.f
duration.i
durationMax.i
EndStructure
Global NewList explo.explo_struct()
Global sphereMesh.i, mtExplo.i
; Create an explosion
Procedure createExplosion(x.f,y.f,z.f,size.f,duration.i)
AddElement(explo())
explo()\x = x
explo()\y = y
explo()\z = z
explo()\sizeMax = size
explo()\durationMax = duration
EndProcedure
; Manage the existing explosions
Procedure manageExplosion()
ForEach explo()
If IsEntity(explo()\entity)
If explo()\duration = explo()\durationMax
FreeEntity(explo()\entity)
DeleteElement(explo())
Continue
EndIf
Else
explo()\entity = CreateEntity(#PB_Any,MeshID(sphereMesh),MaterialID(mtExplo),explo()\x,explo()\y,explo()\z)
;HideEntity(explo()\entity,#True)
EntityPhysicBody(explo()\entity,#PB_Entity_SphereBody,999,0,0)
EndIf
explo()\duration+1
explo()\size = explo()\sizeMax * (Sin((#PI/2) * explo()\duration / explo()\durationMax))
ResizeEntity(explo()\entity,explo()\size,explo()\size,explo()\size)
MoveEntity(explo()\entity,explo()\x,explo()\y,explo()\z,#PB_Absolute)
Next explo()
EndProcedure
;- Initialization
InitEngine3D()
InitSprite()
InitMouse()
InitKeyboard()
;- Window
OpenWindow(0, 0, 0, #SCREENWIDTH, #SCREENHEIGHT, "physics test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(0), 0, 0, #SCREENWIDTH,#SCREENHEIGHT, 0, 0, 0,#PB_Screen_SmartSynchronization)
;-Texture
txBlank = CreateTexture(#PB_Any,4,4)
StartDrawing(TextureOutput(txBlank))
Box(0, 0, 4,4, $FFFFFF)
StopDrawing()
txTerrain = CreateTexture(#PB_Any,256, 256)
StartDrawing(TextureOutput(txTerrain))
Box(0, 0, 256, 256, $007700)
Line(0,256,256,-256, $00BB00)
StopDrawing()
;-Materials
mtTerrain = CreateMaterial(#PB_Any,TextureID(txTerrain))
mtGlass = CreateMaterial(#PB_Any,TextureID(txBlank))
SetMaterialColor(mtGlass,#PB_Material_DiffuseColor,$BBBB00)
MaterialBlendingMode(mtGlass, #PB_Material_Add)
mtRed = CreateMaterial(#PB_Any,TextureID(txBlank))
SetMaterialColor(mtRed,#PB_Material_DiffuseColor,$0000FF)
mtExplo = CreateMaterial(#PB_Any,TextureID(txBlank))
SetMaterialColor(mtExplo,#PB_Material_DiffuseColor,$002233)
MaterialBlendingMode(mtExplo, #PB_Material_Add)
;- Meshes
dimX.f = 50:dimY.f = 50
planeMesh = CreatePlane(#PB_Any,dimX,dimY,1,1,1,1)
cubeMesh = CreateCube(#PB_Any,1)
sphereMesh = CreateSphere(#PB_Any,1)
;- Entities
; Terrain
sol = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(mtTerrain),0,0.2,0)
EntityPhysicBody(sol, #PB_Entity_StaticBody,999,0,0.2)
; Barriers
barrierHeight.f = 10:barrierWidth.f = 0.5
barrier1 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtGlass),0,barrierHeight / 2,-(dimY / 2 + barrierWidth / 2),0)
ScaleEntity(barrier1,dimX,barrierHeight,barrierWidth)
EntityPhysicBody(barrier1, #PB_Entity_BoxBody,0,0.5,0)
barrier2 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtGlass),0,barrierHeight / 2,(dimY / 2 + barrierWidth / 2),0)
ScaleEntity(barrier2,dimX,barrierHeight,barrierWidth)
EntityPhysicBody(barrier2, #PB_Entity_BoxBody,0,0.5,0)
barrier3 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtGlass),-(dimX / 2 + barrierWidth / 2),barrierHeight / 2,0,0)
ScaleEntity(barrier3,barrierWidth,barrierHeight,dimY)
EntityPhysicBody(barrier3, #PB_Entity_BoxBody,0,0.5,0)
barrier4 = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtGlass),(dimX / 2 + barrierWidth / 2),barrierHeight / 2,0,0)
ScaleEntity(barrier4,barrierWidth,barrierHeight,dimY)
EntityPhysicBody(barrier4, #PB_Entity_BoxBody,0,0.5,0)
; Boxes
For i = 1 To 200
box = CreateEntity(#PB_Any,MeshID(cubeMesh),MaterialID(mtRed), (dimX/2 - Random(dimX))*0.9, barrierHeight+Random(10), (dimY/2 - Random(dimY))*0.9,0)
EntityPhysicBody(box,#PB_Entity_BoxBody)
Next i
; Mouse pointer
pointer = CreateEntity(#PB_Any,MeshID(sphereMesh),#PB_Material_None)
;- Camera
CreateCamera(0, 0, 0, 100, 100)
MoveCamera(0,0,50,50,#PB_Absolute)
CameraLookAt(0,0,0,0)
;-Light
AmbientColor($333333)
light = CreateLight(#PB_Any,$FFFFFF,20,40,20)
WorldShadows(#PB_Shadow_Additive)
;- Main loop
wireframe.b = #False
physics.b = #False
KeyboardMode(#PB_Keyboard_International)
Repeat
Delay(1)
While WindowEvent() : Wend
; Activate wireframe/physics render
ExamineKeyboard()
If KeyboardReleased(#PB_Key_W)
wireframe = 1-wireframe
If wireframe = #True
CameraRenderMode(0,#PB_Camera_Wireframe)
Else
CameraRenderMode(0,#PB_Camera_Textured)
EndIf
EndIf
If KeyboardReleased(#PB_Key_P)
physics = 1-physics
If physics = #True
WorldDebug(#PB_World_DebugBody)
Else
WorldDebug(#PB_World_DebugNone)
EndIf
EndIf
; Mouse pointer
ExamineMouse()
If MousePick(0, MouseX(), MouseY()) = sol
MoveEntity(pointer, PickX(), PickY(), PickZ(),#PB_Absolute)
EndIf
If MouseButton(#PB_MouseButton_Left)
If click = #False
createExplosion(EntityX(pointer),EntityY(pointer),EntityZ(pointer),8,20)
click = #True
EndIf
Else
click = #False
EndIf
; Explosions
manageExplosion()
; Render
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End