Screen Shatter Effect

Blitz3D Forums/Blitz3D Programming/Screen Shatter Effect

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

in the meantine, here's all the code (I think);
Function shatter()	

	For ps.pic_shard = Each pic_shard
		FreeImage ps\im:Delete ps
	Next


	img=CreateImage(GraphicsWidth(),GraphicsHeight() )
	screen_splinter_im=LoadAnimImage(("images\splinter1.png"),128,128,0,4)
	MaskImage screen_splinter_im,255,255,255

	screen_splinter2_im=LoadAnimImage(("images\splinter2.png"),128,128,0,4)
	MaskImage screen_splinter2_im,255,255,255
	
	CopyRect 0,0,GraphicsWidth(),GraphicsHeight(),0,0,FrontBuffer(),ImageBuffer(img)
	MaskImage img,255,0,0
	
	Dim matrix(GraphicsWidth()/64,GraphicsHeight()/64)

	shardsacross=(GraphicsWidth()/64)+1
	shardsdown=(GraphicsHeight()/64)+1
	
	For lp=1 To shardsacross*shardsdown
		
		; a little bit of recursion here, shouldn't be too big a deal
		Repeat
  			lpx=Rnd(1,shardsacross)-1
  			lpy=Rnd(1,shardsdown)-1		
 		Until matrix(lpx,lpy)=0	
		matrix(lpx,lpy)=1	
		
		tmp=Rand(0,3)
		
		ps.pic_shard=New pic_shard
		ps\x=lpx*64
		ps\y=lpy*64
		ps\my=(Rnd(-2,0)+(lpy-5))*(Float(GraphicsHeight())/480)
		ps\mx=(Rnd(-1,1)+(Float((lpx*2)-shardsacross)/shardsacross*5))*(Float(GraphicsWidth())/640)
		ps\im=CreateImage(128,128)
			
		CopyRect (lpx*64)-32,(lpy*64)-32,128,128,0,0,ImageBuffer(img),ImageBuffer(ps\im)
		MaskImage ps\im,255,0,0
		SetBuffer ImageBuffer(img)
		DrawImage screen_splinter_im,(lpx*64)-32,(lpy*64)-32,tmp
		SetBuffer ImageBuffer(ps\im)
		DrawImage screen_splinter2_im,0,0,tmp
		Color 255,0,0
		
		If lpy=0 Then Rect 0,0,128,32,1
		If lpy=shardsdown-1 Then Rect 0,96,128,32,1
	Next
	SetBuffer BackBuffer()
	
	FreeImage img:FreeImage screen_splinter_im:FreeImage screen_splinter2_im

End Function

Function update_splinters()
	For ps.pic_shard = Each pic_shard
		ps\y=ps\y+ps\my:ps\my=ps\my+(0.6*(Float(GraphicsHeight())/480))
		ps\x=ps\x+ps\mx
		If ps\y>GraphicsHeight()+100 Or ps\x<-100 Or ps\x>GraphicsWidth()+100 Then FreeImage ps\im:Delete ps
	Next
End Function