Code archives/3D Graphics - Effects/Spinning, exploding titles demo

This code has been declared by its author to be Public Domain code.

Download source code

Spinning, exploding titles demo by big10p2004
Game title made up from cubes spins in a star field and randomly explodes before reconstructing and continuing.
;
; Spinning, exploding, reconstructing titles demo
;
; by big10p (A.K.A. Chris Chadwick) 2003.
;
; Written with Blitz3D v1.83
;

	Graphics3D 800,600,16

	SetBuffer BackBuffer()

	SeedRnd MilliSecs()
	
	Type grid_pix
		Field ent
		Field x#,y#,z#
		Field rot#
	End Type

	Type part
		Field ent
		Field x#,y#,z#
	End Type

	Const TOTAL_STARS = 400	; Number of stars in star field.
	Const EXPLODE% = 400	; Number of frames to explode before imploding.
			
	Global frame_count%
	Global fps%
	Global fps_timeout%
	Global frame_time%
	Global slowest_frame%
	Global frame_start%

	Global title_state% = 3
	Global explode_count%
		
	Global cam = CreateCamera()
	PositionEntity cam,0,0,-14
	
	Global light = CreateLight()

	Global spiv = CreatePivot()
	Global piv = CreatePivot()

	; Master entity the title grid is constructed from.
	Global title_ent = CreateCube()
	EntityShininess title_ent,1
	HideEntity title_ent
	
	; Blur sprite.
	sprite = CreateSprite(cam)
	PositionEntity sprite,0,0,1.1
	ScaleSprite sprite,1.5,1
	SpriteViewMode sprite,1
	EntityAlpha sprite,.124
	EntityColor sprite,0,0,0
	EntityBlend sprite,1
	EntityFX sprite,1
	EntityOrder sprite,1
	Dither False
	CameraClsMode cam,0,1
	
	make_titles()	
	make_stars()

	; Main loop.
	While Not KeyHit(1)
		frame_start = MilliSecs()

		update_titles()
		update_stars()
		
		UpdateWorld
		CopyRect 0,0,800,600,0,0,FrontBuffer(),BackBuffer()
		RenderWorld

		frame_time = MilliSecs() - frame_start	
		;show_info()		

		Flip(1)
	Wend
	
	kill_titles()
	kill_stars()
	
	ClearWorld
		
	End


;
; Update title animation.
;
Function update_titles()

	Local y#
	
	Select title_state
		Case 0	; Prepare title pixels for exploding...

			title_state = 1
			explode_count = EXPLODE
			
			For this.grid_pix = Each grid_pix
				this\x = Rnd(-1,1)
				this\y = Rnd(-1,1)
				this\z = Rnd(-1,1)
				this\rot = Rnd(-1,1)
			Next		

		Case 1	; Explode title pixels...

			For this.grid_pix = Each grid_pix
				TranslateEntity this\ent,this\x,this\y,this\z
				
				; Pitch, yaw and roll rotations must be done separately so that
				; we can reverse the process correctly when reconstructing!
				TurnEntity this\ent,this\rot,0,0
				TurnEntity this\ent,0,this\rot,0
				TurnEntity this\ent,0,0,this\rot
			Next
			
			explode_count = explode_count - 1

			If explode_count = 0
				title_state = 2
				explode_count = EXPLODE
			EndIf		

		Case 2	; Implode/reconstruct exploded title...

			For this.grid_pix = Each grid_pix
				TranslateEntity this\ent,-this\x,-this\y,-this\z
				
				; Do pitch, yaw and roll rotations separately and in REVERSE order
				; from explosion so pixels reconstruct correctly!
				TurnEntity this\ent,0,0,-this\rot
				TurnEntity this\ent,0,-this\rot,0
				TurnEntity this\ent,-this\rot,0,0
			Next
			
			TurnEntity piv,0,-1,0
			
			explode_count = explode_count - 1
			If explode_count = 0 Then title_state = 3				

		Case 3	; Spin the title...

			; Spin faster when showing back and slower when showing front.
			y = Abs(EntityYaw(piv))/2.0
			TurnEntity piv,0,-(.3 + (Sin(y) * (y/20))),0
			
			; Randomly explode title.
			If Rand(1,400) = 100 Then title_state = 0
	End Select
	
End Function


;
; Create the game title grid.
;
Function make_titles()

	Local title_rows% = 0
	Local title_cols% = 0
	Local grid_row$, datum$
	Local pix.grid_pix
	Local grid_step#
	Local tl_x#, tl_y#
	Local title_width# = 18.0
	Local title_height#
	Local pix_size#
			
	; Find width and height of title grid from DATA
	Restore TITLE_DATA
	Read grid_row$
	title_cols = Len(grid_row$)
	Repeat
		title_rows = title_rows + 1
		Read grid_row$
	Until grid_row$ = "."
	
	title_height = title_rows * (title_width/title_cols)

	grid_step = title_width/(title_cols-1)
	tl_x = -title_width/2.0
	tl_y = title_height/2.0

	pix_size# = grid_step/2.0 - 0.04
	ScaleEntity piv,pix_size,pix_size,pix_size
	
	Restore TITLE_DATA
	 
	For r = 1 To title_rows
		Read grid_row$

		For c = 1 To title_cols
			datum$ = Mid$(grid_row$,c,1)

			If datum$ <> " "
				pix = New grid_pix
				pix\ent = CopyEntity(title_ent,piv)
				
				PositionEntity pix\ent,tl_x + ((c-1)*grid_step),tl_y - ((r-1)*grid_step),0,True

				Select datum$
					Case "1"
						EntityColor pix\ent,150,50,0
						ScaleEntity pix\ent,1,1,4
					Case "2"
						EntityColor pix\ent,0,150,0
						ScaleEntity pix\ent,1,1,6
					Case "3"
						EntityColor pix\ent,150,150,0
						ScaleEntity pix\ent,1,1,2
					Case "4"
						EntityColor pix\ent,150,0,0
						ScaleEntity pix\ent,1,1,4
					Default
						EntityColor pix\ent,100,50,0
				End Select
			EndIf
		Next
	Next
		
End Function


;
; Free all mem used by title.
;
Function kill_titles()

	For this.grid_pix = Each grid_pix
		FreeEntity this\ent
		Delete this
	Next

End Function


;
; Show debug info
;
Function show_info()
	
	frame_count = frame_count + 1

	If MilliSecs() > fps_timeout Then
		fps_timeout = MilliSecs() + 1000 
		fps = frame_count 
		frame_count = 0 
	EndIf 
	
	If frame_time > slowest_frame Then slowest_frame = frame_time
	
	Color 0,0,100
	Rect 0,0,200,80,1
	Color 255,255,255
	
	Text 10,10," Triangles: " + TrisRendered()
	Text 10,25," Millisecs: " + frame_time
	Text 10,40,"   slowest: " + slowest_frame
	Text 10,55,"       FPS: " + fps

End Function


;
; Create and initialize stars.
;
Function make_stars()

	For n = 1 To TOTAL_STARS
		this.part = New part
		
		this\ent = CreateSprite()
		EntityColor this\ent,255,255,255
		EntityAutoFade this\ent,200,500
	
		init_star(this)
		update_stars()
	Next

End Function


;
; Free all mem used by stars.
;
Function kill_stars()

	For this.part = Each part
		FreeEntity this\ent
		Delete this
	Next

End Function


;
; Update star field.
;
Function update_stars()

	For this.part = Each part

		If Not EntityInView(this\ent,cam)
			init_star(this)
		Else
			TranslateEntity this\ent,this\x,this\y,this\z
		EndIf
	Next

End Function


;
; Spawn/re-spawn star.
;
Function init_star(star.part)

	r#=Rnd(0.0,360.0)
	star\x = Cos(r)/2.0
	star\y = Sin(r)/2.0
	star\z = -Rnd(.01,.5)

	PositionEntity star\ent,star\x*50,star\y*50,500

End Function


.TITLE_DATA
Data " ttttttttttttttttttttttttttttttttttttttttt "
Data "t                                         t"
Data "t 111 111 111 111 111     111 1 1   1 111 t"
Data "t 1   1 1 1 1 1   1        1  1 11 11 1   t"
Data "t 111 111 111 1   11  111  1  1 1 1 1 11  t"
Data "t   1 1   1 1 1   1        1  1 1   1 1   t"
Data "t 111 1   1 1 111 111      1  1 1   1 111 t"
Data "t                 2222                    t"
Data "t 1 1  1 1   1  22222222  11  111 111 111 t"
Data "t 1 11 1 1   1 2244224422 1 1 1   1 1 1   t"
Data "t 1 1 11  1 1  2222222222 1 1 11  11  111 t"
Data "t 1 1  1  1 1    22  22   1 1 1   1 1   1 t"
Data "t 1 1  1   1    22 22 22  111 111 1 1 111 t"
Data "t              2        2                 t"
Data " ttttttttttttt      3     tttttttttttttttt "
Data "                   3                       "
Data "                    3                      "
Data "                   3                       "
Data "."

Comments

CodeD2004
Cooooooool.


simonh2004
Awesome! Would be interesting to see how this would look if combined with Tokamak to make the little blocks realistically collapse.


wedoe2004
Kewl :)


Olive2004
Even faster with a quad instead of a sprite, also what the "Copyrect" between update and renderworld is for ????

here is the code with the quad

; Blur sprite.
; Create a fullscreen sprite
sprite = CreateMesh(Cam)
sf = CreateSurface(sprite)

; Make a quad
AddVertex sf, -1, 1, 0, 0, 0
AddVertex sf, 1, 1, 0, .1, 0
AddVertex sf, -1,-1, 0, 0, .1
AddVertex sf, 1,-1, 0, .1, .1

AddTriangle sf, 0, 1, 2
AddTriangle sf, 3, 2, 1
PositionEntity sprite,0,0,1.01
ScaleEntity sprite,1.5,1.5,1
EntityAlpha sprite,.124
EntityColor sprite,0,0,0
EntityBlend sprite,1
EntityFX sprite,1+8
EntityOrder sprite,1
Dither False
CameraClsMode cam,0,1

and i removed the Copyrect....don't know why it's here...


Olive2004
I forgot : Good job big10p !!!


Danny2004
Absolute gem! nice one!


Neuro2004
Ooooooooh.....


big10p2004
Cheers all - glad you like!

Olive: basically, without that copyrect, the blur doesnt work correctly and appears too harsh.


Tri|Ga|De2004
Niice work big10P!


IPete22004
Great stuff big10p!

Looks pretty awesome to me!

No external files either! Great!

IPete2.


BlitzSupport2004
Love it!


Kozmi2004
This would make a nice credits thingy in a game.... It is a different approch!

Excellent work man!


Rook Zimbabwe2004
Flat out GROOVY!!!


semar2004
Wonderful !

Sergio.


Panno2004
nice !


Blitzplotter2006
Very impressive.... marvlious... nice bit of code.


Buggy2007
Droool... amazing.


Trader35642007
ye its fun :)


_332007
Modified version of Exploding Title :P

First you need to make an include file.

BLOOMFILTER.bb:


Exploding_title2.bb:



big10p2007
Pretty nice, _33. I only get 20fps on my old crate, tho.

P.S. Can you put your code into code boxes, please (use 'codebox' tag, instead of just 'code').


_332007
Sorry Chris! I left the resolution at 1360x1024! I've lowered to 1024x768 and put the code in the right format.

Cheers.


Blitzplotter2014
Just ran the first post version of this - awesome, wow this was penned (typed) a good 11 years ago - still rocks! ;)


big10p2014
Cheers. 11 years. Wowsers...


BlitzSupport2014
Wow, looks even cooler in 1080p!


Hotshot20052014
Amazing !!!!


RemiD2016
wrong thread, sorry...


Code Archives Forum