Code: Select all
;Basic principle of a firecracker (scriptless)
EnableExplicit
InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()
Structure Particles
id.i
ma.i
EndStructure
Structure _object
id.i
ms.i
tx.i
ma.i
EndStructure
Structure _Default_mat
smoke.i[2]
crack.i[2]
paper.i[2]
fire.i[2]
obj.i[2]
EndStructure
Structure FireCracker
crk.Particles
smoke.Particles
paper.Particles
fire.Particles
ob._object
startTime.i
EndStructure
Declare.i CreateStage()
Declare.i CreateCracker()
Declare.f RandomF(min.f, Max.f, Res.i = 100000)
Global NewList fc.FireCracker()
Global ground._object, basemat._Default_mat, ev.i, Cam.i
OpenWindow(0, 0, 0, 1024, 768, "Firecracker test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0), 0, 0, 1024, 768, #False, 0, 0)
cam = CreateCamera(#PB_Any, 0, 0, 100, 100)
MoveCamera(Cam, 0, 5, 0)
CameraDirection(cam, 0, 0, 1)
CreateStage()
Repeat
Repeat
ev = WindowEvent()
Until ev = 0
ExamineMouse()
RotateCamera(Cam, -MouseDeltaY()*0.05, -MouseDeltaX()*0.05, 0, #PB_Relative)
RenderWorld()
ExamineKeyboard()
If KeyboardReleased(#PB_Key_Space)
CreateCracker()
EndIf
If ListSize(fc()) > 0
ForEach fc()
Select ElapsedMilliseconds()- fc()\startTime
Case 0 To 1000
HideParticleEmitter(fc()\fire\id, #False)
Case 1001 To 1110
HideParticleEmitter(fc()\smoke\id, #False)
HideParticleEmitter(fc()\crk\id, #False)
HideParticleEmitter(fc()\paper\id, #False)
HideParticleEmitter(fc()\fire\id, #True)
Case 1111 To 10000
MoveParticleEmitter(fc()\paper\id, EntityX(fc()\ob\id,#PB_Absolute), EntityY(fc()\ob\id,#PB_Absolute), EntityZ(fc()\ob\id,#PB_Absolute),#PB_Absolute)
ParticleEmitterDirection(fc()\paper\id, RandomF(-1,1), 0, Randomf(-1,1))
Default
FreeParticleEmitter(fc()\crk\id)
FreeParticleEmitter(fc()\paper\id)
FreeParticleEmitter(fc()\smoke\id)
FreeParticleEmitter(fc()\fire\id)
FreeEntity(fc()\ob\id)
DeleteElement(fc())
EndSelect
Next
EndIf
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End
Procedure.i CreateStage()
Protected x.i , y.i, z.i
ground\ms = CreatePlane(#PB_Any, 300, 300, 10, 10, 1, 1)
ground\tx = CreateTexture(#PB_Any, 512, 512)
StartDrawing(TextureOutput(ground\tx))
Box(0, 0, 512, 512, $00B982)
For y = 0 To 512 Step 64
For x = 0 To 512 Step 64
Box(x, 0, 32, 512, $686A69)
Box(0, y, 512, 32, $686A69)
Next x
Next y
StopDrawing()
ground\ma = CreateMaterial(#PB_Any, TextureID(ground\tx))
MaterialBlendingMode(ground\ma, #PB_Material_Add)
ground\id = CreateEntity(#PB_Any, MeshID(ground\ms), MaterialID(ground\ma), 0, 0, 0)
EntityPhysicBody(ground\id, #PB_Entity_StaticBody, 1, 0.2, 40.33)
With basemat
\crack[0] = CreateTexture(#PB_Any, 20, 20)
StartDrawing(TextureOutput(\crack[0]))
DrawingMode(#PB_2DDrawing_Gradient)
FrontColor($7EFEFA)
BackColor($00E1DA)
EllipticalGradient(10, 10, 9, 9)
Ellipse(10, 10, 9, 9)
StopDrawing()
\crack[1] = CreateMaterial(#PB_Any, TextureID(\crack[0]))
MaterialBlendingMode(\crack[1], #PB_Material_Add)
\paper[0] = CreateTexture(#PB_Any, 20, 20)
StartDrawing(TextureOutput(\paper[0]))
Box(0, 0, 20, 20, $ABDFD3)
StopDrawing()
\paper[1] = CreateMaterial(#PB_Any, TextureID(\paper[0]))
MaterialBlendingMode(\paper[1], #PB_Material_Add)
\smoke[0] = CreateTexture(#PB_Any, 20, 20)
StartDrawing(TextureOutput(\smoke[0]))
DrawingMode(#PB_2DDrawing_Gradient)
FrontColor($111111)
BackColor($777777)
EllipticalGradient(10, 10, 8, 8)
Ellipse(10, 10,8, 8)
StopDrawing()
\smoke[1] = CreateMaterial(#PB_Any, TextureID(\smoke[0]))
MaterialBlendingMode(\smoke[1], #PB_Material_Color)
\fire[0] = CreateTexture(#PB_Any, 20, 20)
StartDrawing(TextureOutput(\fire[0]))
DrawingMode(#PB_2DDrawing_Gradient)
FrontColor($FEE689)
BackColor($826800)
EllipticalGradient(10, 10, 10, 5)
Ellipse(10, 10, 10, 5)
FrontColor($2FFAF9)
BackColor($826800)
EllipticalGradient(10, 5, 10, 5)
Ellipse(10, 5, 10, 5)
StopDrawing()
\fire[1] = CreateMaterial(#PB_Any, TextureID(\fire[0]))
MaterialBlendingMode(\fire[1], #PB_Material_Add)
\obj[0] = CreateTexture(#PB_Any, 50, 50)
StartDrawing(TextureOutput(\obj[0]))
Box(0, 0, 100, 100, $0025FD)
DrawingMode(#PB_2DDrawing_Outlined)
For z = 0 To 20
Box(Random(45,1), Random(45,2), 5, 5, $00B6FD)
Next z
StopDrawing()
\obj[1] = CreateMaterial(#PB_Any, TextureID(\obj[0]))
EndWith
EndProcedure
Procedure.i CreateCracker()
AddElement(fc())
fc()\ob\ms = CreateCube(#PB_Any, 0.2)
fc()\ob\id = CreateEntity(#PB_Any, MeshID(fc()\ob\ms),MaterialID(basemat\obj[1]), 0, 5,0)
With fc()\crk
\id = CreateParticleEmitter(#PB_Any, 0.6, 0.6, 0.6, #PB_Particle_Box, 0, 0, 0)
\ma = CopyMaterial(basemat\crack[1], #PB_Any)
ParticleSize(\id, 0.1, 0.1)
ParticleEmissionRate(\id, 600)
ParticleVelocity(\id, 0.01, 0.01)
ParticleTimeToLive(\id, 0.01, 0.02)
ParticleMaterial(\id, MaterialID(basemat\crack[1]))
AttachEntityObject(fc()\ob\id, "", ParticleEmitterID(\id), 0, 0, 0, 0, 0, 0)
HideParticleEmitter(\id, #True)
EndWith
With fc()\smoke
\id = CreateParticleEmitter(#PB_Any, 1, 0.6, 1, #PB_Particle_Box, 0, 0, 0)
\ma = CopyMaterial(basemat\smoke[1], #PB_Any)
ParticleSize(\id, 1, 1)
ParticleEmissionRate(\id, 20)
ParticleVelocity(\id, 0.01, 0.01)
ParticleTimeToLive(\id, 0.01, 0.36)
ParticleSpeedFactor(\id, 0.2)
ParticleMaterial(\id, MaterialID(basemat\smoke[1]))
AttachEntityObject(fc()\ob\id, "", ParticleEmitterID(\id), 0, 0, 0, 0, 0, 0)
HideParticleEmitter(\id, #True)
EndWith
With fc()\paper
\id = CreateParticleEmitter(#PB_Any, 2.9, 0, 2.9, #PB_Particle_Box, 0, 0, 0)
\ma = CopyMaterial(basemat\paper[1], #PB_Any)
ParticleSize(\id, 0.02, 0.06)
ParticleEmissionRate(\id, 50)
ParticleVelocity(\id, 0.01, 0.02)
ParticleTimeToLive(\id, 1.01, 1.5)
ParticleSpeedFactor(\id, 0.2)
ParticleMaterial(\id, MaterialID(basemat\paper[1]))
EndWith
With fc()\fire
\id = CreateParticleEmitter(#PB_Any, 0.02, 0.2, 0.02, #PB_Particle_Point, 0, 0.2, 0)
\ma = CopyMaterial(basemat\fire[1], #PB_Any)
ParticleSize(\id, 0.02, 0.06)
ParticleEmissionRate(\id, 60)
ParticleVelocity(\id, 0.01, 0.01)
ParticleTimeToLive(\id, 0.01, 0.02)
ParticleMaterial(\id, MaterialID(basemat\fire[1]))
AttachEntityObject(fc()\ob\id, "", ParticleEmitterID(\id), 0, 0, 0, 0, 0, 0)
HideParticleEmitter(\id, #True)
EndWith
EntityPhysicBody(fc()\ob\id, #PB_Entity_BoxBody, 0.005, 2.41, 0.02)
ApplyEntityImpulse(fc()\ob\id, 0, 0.015, 0.0441)
fc()\startTime = ElapsedMilliseconds()
EndProcedure
Procedure.f RandomF(min.f, Max.f, Res.i = 100000)
ProcedureReturn (Min + (Max - Min) * Random(Res) / Res)
EndProcedure

