GLBasic forum

Codesnippets => Code Snippets => Topic started by: MrTAToad on 2012-Apr-17

Title: Pixel Explosion
Post by: MrTAToad on 2012-Apr-17
I wrote this before I found that I needed a sprite explosion routine.  This one creates an explosion using pixels...

Code (glbasic) Select
LOCAL e AS TExplosion

e.Initialise()
SYSTEMPOINTER TRUE
WHILE TRUE
SMOOTHSHADING FALSE

e.Display()

ALPHAMODE -1.0

PRINT "Number of 4x4 pixel rectangles : "+BOUNDS(e.explosionList[],0),0,0,TRUE
SHOWSCREEN

e.Process(0.1)
MOUSESTATE mx%,my%,b1%,b2%

IF b1%
e.Add(-1,mx%,my%,0.1,5.5,16+RND(64))
ENDIF
WEND


Code (glbasic) Select
TYPE tExplosionData
spriteID%
x
y
moveAngle
moveSpeed
turnAngle
turnSpeed
width%
height%
fadeSpeed
alpha
ENDTYPE

TYPE TExplosion
explosionList[] AS tExplosionData

FUNCTION Initialise%:
self.Destroy()
RETURN TRUE
ENDFUNCTION

FUNCTION Destroy%:
DIM self.explosionList[0]
ENDFUNCTION

FUNCTION Add%:spriteID%,x,y,fadeSpeed,moveSpeed,amount%
LOCAL e AS tExplosionData
LOCAL recXSize%=5,recYSize%=5

e.spriteID%=spriteID%
IF e.spriteID%>=0
GETSPRITESIZE e.spriteID%,e.width%,e.height%
e.turnAngle=RND(359)
ELSE
e.width%=recXSize%
e.height%=recYSize%
e.turnAngle=0.0
ENDIF

e.fadeSpeed=fadeSpeed

e.alpha=-1.0

WHILE amount%>0
e.moveAngle=RND(359)
e.moveSpeed=moveSpeed+RND(moveSpeed*2)
e.x=x+RND(e.width%*2)-e.width%
e.y=y+RND(e.height%*2)-e.height%

DIMPUSH self.explosionList[],e

DEC amount%
WEND

RETURN TRUE
ENDFUNCTION

FUNCTION Display%:
LOCAL loop AS tExplosionData

FOREACH loop IN self.explosionList[]
ALPHAMODE loop.alpha

IF loop.spriteID%>=0
ROTOZOOMSPRITE loop.spriteID%,loop.x-(loop.width%/2),loop.y-(loop.height%/2),loop.turnAngle,1.0
ELSE
DRAWRECT loop.x-(loop.width%/2),loop.y-(loop.height%/2),loop.width%,loop.height%,RGB(255,0,0)
ENDIF
NEXT
ENDFUNCTION

FUNCTION Process%:speed
LOCAL loop AS tExplosionData

FOREACH loop IN self.explosionList[]
IF loop.alpha>=-0.01
DELETE loop
ELSE
INC loop.x,SIN(loop.moveAngle)*loop.moveSpeed*speed
INC loop.y,COS(loop.moveAngle)*loop.moveSpeed*speed
INC loop.alpha,speed*loop.fadeSpeed
INC loop.turnAngle,speed*loop.moveSpeed
IF loop.turnAngle>=360.0 THEN DEC loop.turnAngle,360.0
ENDIF
NEXT
ENDFUNCTION

FUNCTION IsEmpty%:
IF BOUNDS(self.explosionList[],0)=0
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNCTION
ENDTYPE
Title: Re: Pixel Explosion
Post by: mentalthink on 2012-Apr-25
Very interesting and usefull!!!...  :nw: :nw:
Title: Re: Pixel Explosion
Post by: kaotiklabs on 2012-Apr-25
Yes, really useful!
Looking for giving it a good use!
Title: Re: Pixel Explosion
Post by: MrTAToad on 2012-Apr-27
Glad you like it!
Title: Re: Pixel Explosion
Post by: Hemlos on 2012-Jun-16
You shoulda used spritez, you reinvented the wheel ;P




[attachment deleted by admin]
Title: Re: Pixel Explosion
Post by: mentalthink on 2012-Jun-16
Very nice effect "Fire" whit the sprite ...
Title: Re: Pixel Explosion
Post by: Hemlos on 2012-Jun-16
Its super fast too :)
That sample in my message above will be included in the next spritez update.
I did post this one as a "help" for someone, i put it together as a sample now.
Title: Re: Pixel Explosion
Post by: MrTAToad on 2012-Jun-19
Yes, I should have used SpriteZ really :)