06-04-2005, 12:22 AM
This is my 3D particle explosion simulator...
Uses some of my PQBLib routines
See what u think 8)
(Arrow keys to rotate, Enter to explode particles, ESC to exit)
Uses some of my PQBLib routines
See what u think 8)
(Arrow keys to rotate, Enter to explode particles, ESC to exit)
Code:
'$DYNAMIC
DECLARE SUB CreateParticleEffect (NParticles%, X%, Y%, Z%)
DECLARE SUB HandleParticles3D ()
DECLARE SUB PQB.BufferCopy (Array%())
DECLARE SUB PQB.Init (Array%())
DECLARE SUB PQB.Pset (X%, Y%, C%, DestSeg%, DestOff%)
DECLARE SUB PQB.ClearBuffer (Array%())
DIM SHARED Gravity!, ExMagnitude!, Particles%
'==================================================
Gravity! = 0 'Gravity
ExMagnitude! = .7 'Explosion magnitude
Particles% = 1000 'Max particles, I wouldn't go over 1750
'==================================================
CONST False = 0, True = NOT False
SCREEN 13
DIM SHARED Buffer(32001) AS INTEGER
DIM SHARED Pause%, NoFade%, PlotX!, PlotY!
PQB.Init Buffer()
RANDOMIZE TIMER
TYPE Particles
A AS INTEGER
X AS SINGLE
Y AS SINGLE
Z AS SINGLE
YV AS SINGLE
XV AS SINGLE
ZV AS SINGLE
Gravity AS SINGLE
C AS SINGLE
END TYPE
TYPE Engine
XCenter AS INTEGER
YCenter AS INTEGER
ZCenter AS INTEGER
Theta AS INTEGER
Phi AS INTEGER
END TYPE
DIM SHARED C!(359), S!(359)
DIM SHARED Engine AS Engine
CONST PI = 3.141593
FOR Angle% = 0 TO 359
C!(Angle%) = COS(Angle% * PI / 180)
S!(Angle%) = SIN(Angle% * PI / 180)
NEXT
DIM SHARED Particle(Particles% - 1) AS Particles
Engine.XCenter = 160
Engine.YCenter = 100
Engine.ZCenter = 256
Engine.Phi = 0
Engine.Theta = 0
DO
Keypress% = INP(&H60)
SELECT CASE Keypress%
CASE 77
Engine.Theta = Engine.Theta + 5
CASE 75
Engine.Theta = Engine.Theta - 5
CASE 72
Engine.Phi = Engine.Phi - 5
CASE 80
Engine.Phi = Engine.Phi + 5
CASE 28
CreateParticleEffect 100, 0, 0, 0
CASE &H1
END
END SELECT
IF Engine.Theta > 359 THEN Engine.Theta = 0
IF Engine.Phi > 359 THEN Engine.Phi = 0
IF Engine.Theta < 0 THEN Engine.Theta = 359
IF Engine.Phi < 0 THEN Engine.Phi = 359
PQB.ClearBuffer Buffer()
HandleParticles3D
PQB.BufferCopy Buffer()
ParticlesActive% = 0
FOR V% = 0 TO Particles% - 1
IF Particle(V%).A THEN ParticlesActive% = ParticlesActive% + 1
NEXT
IF TIMER - ST! >= 1 THEN
ST! = TIMER
FramesPer = Frames
Frames = 0
END IF
Frames = Frames + 1
DEF SEG = 0: POKE &H41A, PEEK(&H41C)
LOCATE 23, 1: PRINT "Active Particles:"; ParticlesActive%; "FPS:"; FramesPer
LOOP
REM $STATIC
SUB CreateParticleEffect (NParticles%, X%, Y%, Z%)
IF NParticles% <= 0 THEN EXIT SUB
XMin! = ExMagnitude!
XMax! = ExMagnitude!
YMin! = ExMagnitude!
YMax! = ExMagnitude!
ZMin! = ExMagnitude!
ZMax! = ExMagnitude!
FOR V% = 0 TO Particles% - 1
IF NOT Particle(V%).A THEN
Particle(V%).A = True
Particle(V%).X = X%
Particle(V%).Y = Y%
Particle(V%).Z = Z%
Particle(V%).XV = (RND * XMin!) - (RND * XMax!)
Particle(V%).YV = (RND * YMin!) - (RND * YMax!)
Particle(V%).ZV = (RND * ZMin!) - (RND * ZMax!)
Particle(V%).Gravity = Gravity!
Particle(V%).C = 31
ParticlesAdded% = ParticlesAdded% + 1
END IF
IF ParticlesAdded% = NParticles% OR V% = Particles% - 1 THEN EXIT SUB
NEXT
END SUB
SUB HandleParticles3D
FOR V% = 0 TO Particles% - 1
IF Particle(V%).A = True THEN
Particle(V%).YV = Particle(V%).YV + Particle(V%).Gravity
Particle(V%).X = Particle(V%).X + Particle(V%).XV
Particle(V%).Y = Particle(V%).Y + Particle(V%).YV
Particle(V%).Z = Particle(V%).Z + Particle(V%).ZV
Particle(V%).C = Particle(V%).C - .05
IF INT(Particle(V%).C) = 16 THEN Particle(V%).A = False
RX = -Particle(V%).Z * S!(Engine.Theta) + Particle(V%).X * C!(Engine.Theta)
RY = -Particle(V%).Z * C!(Engine.Theta) * S!(Engine.Phi) - Particle(V%).X * S!(Engine.Theta) * S!(Engine.Phi) - Particle(V%).Y * C!(Engine.Phi)
RZ = -Particle(V%).Z * C!(Engine.Theta) * C!(Engine.Phi) - Particle(V%).X * S!(Engine.Theta) * C!(Engine.Phi) + Particle(V%).Y * S!(Engine.Phi)
PlotX! = 256 * (RX / (RZ + Engine.ZCenter)) + Engine.XCenter
PlotY! = 256 * (RY / (RZ + Engine.ZCenter)) + Engine.YCenter
IF NoFade% THEN
C% = 1
ELSE
C% = Particle(V%).C
END IF
IF PlotX! > 639 THEN Particle(V%).A = False
IF PlotX! < -319 THEN Particle(V%).A = False
IF PlotY! > 399 THEN Particle(V%).A = False
IF PlotY! < -199 THEN Particle(V%).A = False
PQB.Pset INT(PlotX!), INT(PlotY!), C%, VARSEG(Buffer(0)), VARPTR(Buffer(2))
END IF
NEXT
END SUB
SUB PQB.BufferCopy (Array%())
PUT (0, 0), Array%, PSET
END SUB
SUB PQB.ClearBuffer (Array%())
REDIM Array%(32001)
Array%(0) = 2560
Array%(1) = 200
END SUB
SUB PQB.Init (Array%())
Array%(0) = 2560
Array%(1) = 200
END SUB
SUB PQB.Pset (X%, Y%, C%, DestSeg%, DestOff%)
DEF SEG = DestSeg%
IF X% > 0 AND X% < 319 AND Y% > 0 AND Y% < 199 THEN POKE DestOff% + (Y% * 320&) + X%, C%
END SUB