Fire over Background with Blit

BlitzPlus Forums/BlitzPlus Programming/Fire over Background with Blit

Richard Betson(Posted 2003) [#1]
Just a quick example using blits to animate fire over a background.

You will need to use you own background image (save the one shown here). Make sure it is 640 x 480 and in the same directory you save the code to. :)

Here is the code:







;Fire Over Image Demo for B+
;Copyright 2003, Richard R Betson
;www.redeyeware.50megs.com
;vidiot@...

;Blur/Fade/Image Fire... Blit Method

Global fpsl=True ;<------------ Change this to False for Fastest Diplay
							;   May result in some scree errors.
							;default = true

Const width=640
Const height=480
Const depth=16
Global fade_clr=10	;"                         "
Global fade#=1	;<=- Adjust for fade control
Global blur=4
Global height1=height-1
Global width1=(width/2)-1
Global f_step=3		;<=- Adjust for flame rise
Global yy=474

If fpsl=True
	timer=CreateTimer(35)  ;<===--- Change to adjust flame rate
	fade_clr=2
	fade#=7.57
EndIf





Graphics width,height,depth,1
Global blockbank=CreateBank(500*500*4)
Global clrbank=CreateBank(width*height*4)
Global pic_bank=CreateBank(width*height*4)
Dim pic(width,height)
 
Global img=LoadImage("blogo2.bmp")  ;*** <<<<< Use your own 640 x 480 image here

SetBuffer BackBuffer()


For y= 0 To height1 

	For x= 1 To (width-1) Step 2
	clr=ReadPixel(x,y,ImageBuffer(img))
	red=((clr Shr 16) And 255)/8
	green=((clr Shr 8) And 255)/4
	blue=((clr) And 255)/8
	clr1=((red Shl 11 ) Or (green Shl 5 ) Or (blue )) 
	clr=ReadPixel((x+1),y,ImageBuffer(img)) 
	red=((clr Shr 16) And 255)/8
	green=((clr Shr 8) And 255)/4
	blue=((clr) And 255)/8
	clr2=((red Shl 11 ) Or (green Shl 5 ) Or (blue )) 

	pic((x/2),y)=(clr2 Shl 16 Or clr1)
	Next
	xx=xx+1
Next
 







LockBuffer 
	bank=LockedPixels()
For y=1 To height1
	offset=y*LockedPitch()
	For x= 1 To width1 
		PokeInt pic_bank,offset+x*4,pic(x,y)
		PokeInt bank,offset+x*4,pic(x,y)
	Next
Next
UnlockBuffer 



LockBuffer
	
For y=0 To 49
	offset=y*LockedPitch()
	
	For x= 0 To 24
		PokeInt blockbank,offset+x*4,clr;
	Next
Next
UnlockBuffer

While  Not KeyHit(1)
		If ct1<=tm
			ct1=tm+Rnd(30)
			LockBuffer 
		For i= 0 To 120+Rnd(50)
		
			xx=Rnd(345)+1
			gr=Rnd(112)+30
			clrt=((254/8 Shl 27) Or((gr/4) Shl 21) Or((40/8) Shl 16) Or ((254/8) Shl 11) Or ((gr/4) Shl 5) Or (40/8))  

			For y=yy To yy+5
				offset=y*LockedPitch()
				For x=xx To Rnd(15)+xx
					PokeInt clrbank,offset+x*4,clrt
				Next
			Next
		Next
			UnlockBuffer		
		EndIf
		
	If KeyHit(2)
		SaveBuffer (FrontBuffer(),"fireover_image.bmp")
	EndIf 


	If fpsl=True
		blur_fade()
		WaitTimer(timer)
	Else
		If ct<tm
			ct=tm+32
			blur_fade()
		EndIf
	EndIf

	
	tm=MilliSecs()
	fps=fps+1
	If fps_t<MilliSecs()
	fp$=" "+Str$(fps)
	fps2=fps
	fps_t=1000+MilliSecs()
	fps=0
	EndIf
	Text 10,465,"FPS: "+fp$
	
	Flip False

Wend

End






Function blur_fade()


LockBuffer
		bank=LockedPixels()
For y=240 To height

	offset=y*LockedPitch()
	offsetn=(y-1)*LockedPitch()
	offsets=(y+1)*LockedPitch()
	offsetz=(y-f_step)*LockedPitch()

	For x= 1 To width1

		tmpa=PeekShort(clrbank,(offset+2)+x*4) ;And 255
		c1=PeekShort(clrbank,(offsetn+2)+x*4) ;And 255
		c2=PeekShort(clrbank,(offsets+2)+x*4) ;And 255
		c3=PeekShort(clrbank,(offset+2)+(x-1)*4) ;And 255
		c4=PeekShort(clrbank,(offset+2)+(x+1)*4) ;And 255


csa=(tmpa+c1+c2+c3+c4)

If csa>10
		tc=tc4
		tc2=tc5
		tc3=tc6

		lc=((tc Shl 11) Or (tc2 Shl 5) Or (tc3))


	tmp=((tmpa Shr 11) ) And $1F; And 255
	tc4=((tmp *blur)+(c1 Shr 11 And $1F) +(c2 Shr 11 And $1F) +(c3 Shr 11 And $1F) +(c4 Shr 11 And $1F))/fade; Shr 3
	tmp=(tmpa Shr 5 ) And $3F;And$FF;And 255 
	tc5=((tmp*blur)+(c1 Shr 5 And $3F) +(c2 Shr 5 And $3F) +(c3 Shr 5 And $3F) +(c4 Shr 5 And $3F) )/fade
	tmp=(tmpa ) And $1F;And$FF
	tc6=((tmp*blur)+(c1 And $1F)  + (c2 And $1F) + (c3 And $1F) + (c4 And $1F)) /fade
;EndIf


tc4=(tc4-fade_clr)
tc5=(tc5-fade_clr)
tc6=(tc6-fade_clr)

If tc4<10 Then tc4=0
If tc5<10 Then tc5=0
If tc6<10 Then tc6=0

hc=((tc4 Shl 11) Or (tc5 Shl 5) Or (tc6))

PokeInt clrbank,offsetz+x*4,(hc Shl 16 Or lc);

Else

tc4=0
tc5=0
tc6=0

PokeInt clrbank,offsetz+x*4,(hc Shl 16 Or lc);+(hc Shl 16 Or lc);

EndIf

If hc>0
PokeInt bank,(offset)+x*4,(hc Shl 16 Or lc) + (hc Shl 16 Or lc)
Else
PokeInt bank,(offset)+x*4,(PeekInt(pic_bank,offset+x*4)) 

EndIf

		
	Next
Next

UnlockBuffer 

End Function


L8r,