Files
BlitzNext/#Test/samples/birdie/Explode/Explode.bb
T

110 lines
3.1 KiB
BlitzBasic

;Example of exploding an entity
;David Bird
;dave@birdie72.freeserve.co.uk
;15/6/01 (beta 2.24)
Graphics3D 640,480
SetBuffer BackBuffer()
piv=CreatePivot()
cam=CreateCamera(piv)
PositionEntity cam,0,0,-5
mesh=CreateSphere(10)
tex=LoadTexture("tex0.bmp")
ScaleTexture tex,.5,.5
EntityTexture mesh,tex
While Not KeyDown(1)
If KeyHit(57) Then Create_Explosion(mesh,tex) ;Space Bar to produce explosion
If KeyDown(203) TurnEntity piv,0,-1,0 ;Arrow keys to
If KeyDown(205) TurnEntity piv,0,+1,0 ;swing camera
If KeyDown(200) TurnEntity piv,1,0,0 ;round the object
If KeyDown(208) TurnEntity piv,-1,0,0 ;
Update_Particles()
UpdateWorld
RenderWorld
Text 0,0,"Hit <space> to blow up the sphere!"
Flip
Wend
;
;Freeup memory used in demo
Free_Particles()
FreeEntity mesh
FreeEntity cam
EndGraphics
End
Type particle
Field ent
Field surf
Field dx#
Field dy#
Field dz#
Field cnt
End Type
Function Update_Particles()
;Each particle is a triangle
;as there cnt is reduced and become less than
;100 the particles alpha is reduced
;to slowerly fade to nothing.
For a.particle=Each particle
TranslateEntity a\ent,a\dx,a\dy,a\dz
TurnEntity a\ent,4*a\dx,4*a\dy,2
a\cnt=a\cnt-1
If a\cnt<100 Then
EntityAlpha a\ent,Float(a\cnt)/100.0
End If
If a\cnt<1 Then
FreeEntity a\ent
Delete a
End If
Next
End Function
Function Free_Particles()
For a.particle=Each particle
If a\ent Then FreeEntity a\ent
Delete a
Next
End Function
Function Create_Explosion(mesh,texture)
surf=GetSurface(mesh,CountSurfaces(mesh)) ;Get the surface from mesh
nt=CountTriangles(surf) ;How many triangles are in there.
For cnt=0 To nt-1 Step 2
a.particle=New particle
a\ent=CreateMesh()
a\surf=CreateSurface(a\ent)
ind1=TriangleVertex(surf,cnt,0);get the verices 0
ind2=TriangleVertex(surf,cnt,1); ~ ~ --~-- 1
ind3=TriangleVertex(surf,cnt,2); ~ ~ --~-- 2
x#=VertexX(surf,ind1) ;retrieve vertex index 0 for this triangle
y#=VertexY(surf,ind1) ;going tro use this for particle velocity
z#=VertexZ(surf,ind1)
a\dx=x*(Rnd(.015,.035)) ;reduce velocity by a random number in x
a\dy=y*(Rnd(.015,.035)) ;reduce velocity by a random number in y
a\dz=z*(Rnd(.015,.035)) ;reduce velocity by a random number in z
;Now recreate this tri as an entity
AddVertex(a\surf,VertexX(surf,ind1)-x,VertexY(surf,ind1)-y,VertexZ(surf,ind1)-z,VertexU(surf,ind1),VertexV(surf,ind1))
VertexColor a\surf,0,VertexRed(surf,ind1),VertexGreen(surf,ind1),VertexBlue(surf,ind1)
AddVertex(a\surf,VertexX(surf,ind2)-x,VertexY(surf,ind2)-y,VertexZ(surf,ind2)-z,VertexU(surf,ind2),VertexV(surf,ind2))
VertexColor a\surf,0,VertexRed(surf,ind2),VertexGreen(surf,ind2),VertexBlue(surf,ind2)
AddVertex(a\surf,VertexX(surf,ind3)-x,VertexY(surf,ind3)-y,VertexZ(surf,ind3)-z,VertexU(surf,ind3),VertexV(surf,ind3))
VertexColor a\surf,0,VertexRed(surf,ind3),VertexGreen(surf,ind3),VertexBlue(surf,ind3)
;Now add the triangle to the entity
;double sided
AddTriangle(a\surf,0,1,2)
AddTriangle(a\surf,0,2,1)
PositionEntity a\ent,x,y,z
a\cnt=Rnd(150,200)
EntityTexture a\ent,texture
Next
End Function