Delta Timing need help

Blitz3D Forums/Blitz3D Programming/Delta Timing need help

I have this code from Sprite Candy that includes delta timing but I am having trouble understanding it and taking out just the parts I need to use it in my own game.

Here`s the code, I hope the author won`t mind as it is freely availble from his site.

Hopefully someone can explain to me what I need to use from this at a minimum to get it working in my code, also a little explaination would be most welcome. Here`s the code...

Thanks for any help.


; ------------------------------------------------------------------------
; BLASTEROIDS
; AUTHOR:    MIKE DOGAN
; COPYRIGHT: (c)2004/2005 MIKE DOGAN / X-PRESSIVE.COM 
; ------------------------------------------------------------------------


SeedRnd MilliSecs()+ScanLine() : HidePointer()


; ------------------------------------------------------------------------
; GLOBALS
; ------------------------------------------------------------------------

; SOUNDS
Global Snd_Unfreeze	= LoadSound ("Media\snd_unfreeze.mp3")
Global Snd_Freeze%	= LoadSound ("Media\snd_freeze.mp3")
Global Snd_NextStage%	= LoadSound ("Media\snd_next_stage.mp3")
Global Snd_Collide%	= LoadSound ("Media\snd_collide.mp3")
Global Snd_Shot1%	= LoadSound ("Media\snd_shot.mp3")
Global Snd_Shot2%	= LoadSound ("Media\snd_powershot.mp3")
Global Snd_Missile%	= LoadSound ("Media\snd_missile.mp3")
Global Snd_CExplode%	= LoadSound ("Media\snd_comet_explode.mp3")
Global Snd_CHit%	= LoadSound ("Media\snd_comet_hit.mp3")
Global Snd_Pickup%	= LoadSound ("Media\snd_pickup.mp3")
Global Snd_Shield_Off%	= LoadSound ("Media\snd_shield_off.mp3")
Global Snd_Cannon_On%	= LoadSound ("Media\snd_turbofire_on.mp3")
Global Snd_Cannon_Off%	= LoadSound ("Media\snd_turbofire_off.mp3")
Global Snd_GameOver%	= LoadSound ("Media\snd_game_over.ogg")
Global Snd_ButtonC%	= LoadSound ("Media\snd_button_click.mp3")
Global Snd_ButtonH%	= LoadSound ("Media\snd_button_hover.mp3")
Global Snd_Warning%	= LoadSound ("Media\snd_warning.ogg")
Global Snd_LaserHit%	= LoadSound ("Media\snd_laser_hit.ogg")

Global Snd_Laser%	= LoadSound ("Media\snd_laser.ogg")       : LoopSound Snd_Laser
Global Chn_Laser%
Global Snd_Enemy%	= LoadSound ("Media\snd_enemy.ogg")       : LoopSound Snd_Enemy
Global Chn_Enemy%
Global Snd_Title%	= LoadSound ("Media\snd_title.mp3")       : LoopSound Snd_Title
Global Chn_Title%
Global Snd_Shield%	= LoadSound ("Media\snd_shield.mp3")      : LoopSound Snd_Shield
Global Chn_Shield%
Global Snd_Mace%	= LoadSound ("Media\snd_mace.ogg")        : LoopSound Snd_Mace
Global Chn_Mace%
Global Snd_MaceHit%	= LoadSound ("Media\snd_mace_hit.mp3") 
Global Chn_MaceHit%
Global Snd_GameMusic%	= LoadSound ("Media\snd_ingame_loop.mp3") : LoopSound Snd_GameMusic
Global Chn_GameMusic%
Global Snd_Thrust%	= LoadSound ("Media\snd_thrust.mp3")      : LoopSound Snd_Thrust
Global Chn_Thrust%
Global Snd_Highscore%	= LoadSound ("Media\snd_highscore.mp3")   : LoopSound Snd_Highscore
Global Chn_Highscore%

; DEFAULT SAVE SETTINGS
Global center_player%   = False ; RESET PLAYER TO SCREEN CENTER AFTER HIT
Global show_bars%       = True	; DISPLAY COMET ENERGY
Global show_backstage%  = True  ; DISPLAY 3D PLANET
Global pickups_enabled%	= True	; PLAY WITH OR WITHOUT PICKUPS
Global use_shadows%     = True	; DRAW OBJECT SHADOWS IF > 0
Global difficulty%      = 2	; 1 = EASY, 2 = NORMAL, 3 = HARD	
Global fullscreen%      = 0 : If Windowed3D() Then fullscreen = 2
Global screen_width% 	= 800	; SCREEN RESOLUTION X
Global screen_height%	= 600	; SCREEN RESOLUTION Y
Dim    scores%(10)		; HIGHSCORES
Dim    names$ (10)		; HIGHSCORES (NAMES)
For i% = 1 To 10
	scores(i) = 110000 - (i*10000)
	names$(i) = "X-PRESSIVE.COM"
Next

; OVERRIDE WITH SAVED SETTINGS, IF ANY
Include "include - settings.bb" : LoadSettings()


; DELTA TIME
Const  FPS#   = 60.0	
Global delta# = 1.0

; GAME VARIABLES
Global second_frame%		; SET TO TRUE EVERY 2ND FRAME (FOR STUFF THAT DOESN'T NEED TO BE DONE ON EVERY FRAME)
Global prev% = MilliSecs()	; LAST FRAME TIME	
Global now%  = MilliSecs()	; HOLDS ACTUAL TIME (MILLISECS)
Global ship_rotspeed# = 4.0	; SHIP ROTATION SPEED
Global ship_radius#		; REMEMBER SHIP RADIUS (FOR COLLISION CHECK)
Global ship_angle#		; HOLDS CURRENT SHIP ROTATION (GLOBAL)
Global ship_x%			; CURRENT SHIP X-POS (GLOBAL)
Global ship_y%			; CURRENT SHIP Y-POS (GLOBAL)
Global ship_accel# = 5.0	; SHIP ACCELERATION POWER
Global ship_velx#		; CURRENT SHIP X-VELOCITY
Global ship_vely#		; CURRENT SHIP Y-VELOCITY
Global stage%			; CURRENT STAGE (LEVEL)
Global score%			; SCORE
Global fuel#			; FUEL   (0 - 100)
Global energy#			; ENERGY (0 - 100)
Global num_comets% 		; NUMBER OF COMETS TO CREATE FOR CURRENT STAGE
Global comet_speed%		; COMET TRAVEL SPEED
Global refuel_per_stage%	; BONUS FUEL PER STAGE
Global comet_type%		; COMET VISUAL TYPE
Global game_over%		; INDICATES IF GAME IS OVER
Global pickup_speed%		; PICKUP ITEMS TRAVEL SPEED
Global pickup_chance%		; CHANCE TO GIVE A PICKUP (0 - 100)
Global trails_pause% = 50	; PAUSE (MILLISECS) BETWEEN PLACING TRAIL OBJECTS (SMOKE)
Global trails_last%		; LAST TRAIL SET TIME (MILLISECS)
Global last_moved%		; LAST TIME PLAYER MOVED (SEND ENEMY SHIP IF PLAYER DOES NOT MOVE)
Global enemy_wait%		; TIME TO WAIT UNTIL ENEMY SHIP APPEARS
Global enemy_radius#		; REMEMBER ENEMY RADIUS (FOR COLLISION CHECK)
Global enemy_energy%		; ENEMY SHIP'S ENERGY
Global enemy_speed%		; ENEMY SHIP'S TRAVEL SPEED
Global bar_height# 	= screen_height-172 ; HEIGHT OF FUEL / ENERGY BARS

; WEAPON SETTINGS
Global missile_pause = 1000	; PAUSE (MILLISECS) BETWEEN MISSILE LAUNCHES
Global missile_last%		; LAST MISSILE LAUNCH TIME
Global shot_speed%		; SHOT TRAVEL SPEED
Global shot_power%		; IMPACT POWER OF NORMAL BULLETS
Global missile_power%		; IMPACT POWER OF MISSILES
Global power_shots%		; NUMBER OF POWER SHOTS LEFT
Global double_shots%		; NUMBER OF DOUBLE SHOTS LEFT
Global missiles%		; NUMBER OF MISSILES LEFT
Global turboFire%		; TURBO FIRE ACTIVE WHILE > 0
Global turboFireMax% = 500	; TURBO FIRE MAXIMUM (SHOTS)
Global turbo_pause%  = 15	; PAUSE (MILLISECS) BETWEEN TURBO FIRE SHOTS
Global turbo_last%		; LAST TURBO FIRE SHOT (MILLISECS)
Global time_freeze%		; TIME OF LAST TIME FREEZE
Global freeze_duration%		; TIME FREEZE DURATION
Global time_shield%		; TIME OF SHIELD ACTIVATION
Global shield_duration%		; SHIELD DURATION
Global mace_radius#		; RADIUS (SIZE) OF MACE WEAPON
Global time_mace%		; TIME OF MACE ACTIVATION
Global mace_duration%		; MACE WEAPON DURATION
Global time_laser%		; TIME OF LASER ACTIVATION
Global laser_duration%		; LASER WEAPON DURATION
Global laser_last%		; LAST LASER HIT
Global laser_power%		; LASER KILLING POWER
Global bombs%			; NUMBER OF BOMBS LEFT

; DIFFICULTY TEXTS
Dim txt_difficulty$(3)
txt_difficulty(1) = "EASY"
txt_difficulty(2) = "NORMAL"
txt_difficulty(3) = "HARD"

; TITLE ENTITIES
Dim    Layers% (6,10)
Dim    Flares% (10)
Dim    Buttons%(10,10) ; (HUD-PAGE, BUTTON-NUMMER)
Global Title%
Global Flash%

; GAME ENTITIES
Global Ship%
Global Burst%
Global Shield%
Global Enemy%
Global Mace%
Global MaceLine%
Global Laser%
Global LaserFlare%
Global Bar_Energy%
Global Bar_Fuel%
Global Bar_Cannon%
Global Bar_Enemy%
Global Txt_Score%
Global Txt_Bombs%
Global Txt_Missiles%
Global Txt_Stage%
Global Txt_FPS%
Global Fader%
Global Lyr_Objects%
Global Lyr_Shots%
Global Lyr_Bright% 
Global Lyr_Bars%   
Global Lyr_Text1%
Global Lyr_Text2%
Global Lyr_Fader%
Global Lyr_Top%

; PICKUPS
Dim pickup_types$(11)
pickup_types$(0) = "ENERGY+"
pickup_types$(1) = "POWER SHOT"
pickup_types$(2) = "FUEL+"
pickup_types$(3) = "TIME FREEZE"
pickup_types$(4) = "BOMB+"
pickup_types$(5) = "DOUBLE SHOT"
pickup_types$(6) = "INSTANT BOMB"
pickup_types$(7) = "KILLER SHIELD"
pickup_types$(8) = "HYPER CANNON"
pickup_types$(9) = "MISSILES+"
pickup_types$(10)= "IRON MACE"
pickup_types$(11)= "POWER LASER"

; TYPES
Type TComet
	Field ObjectID%
	Field size%
	Field radius%
	Field shield%
	Field angle#
	Field typ%
	Field Bar%
	Field aimed% ; BY MISSILE
End Type

Type TShot
	Field ObjectID%
	Field powershot%
End Type

Type TMissile
	Field ObjectID%
	Field TargetID%
	Field CometID%
	Field radius%
End Type

Type TPickup
	Field ObjectID%
	Field radius%
	Field typ$
End Type


; ------------------------------------------------------------------------
; INCLUDE SPRITE CANDY
; ------------------------------------------------------------------------
Include "..\..\sprite candy.bb"


.INITGRAPHICS
Graphics3D screen_width, screen_height, 0, fullscreen : SetBuffer BackBuffer()


; ------------------------------------------------------------------------
; CREATE HUDS, LOAD RESOURCES
; ------------------------------------------------------------------------

; CREATE HUDs
Global Cam    = CreateCamera()
Global HUD1%  = HUD_Create (Cam)
Global HUD2%  = HUD_Create (Cam)
Global HUD3%  = HUD_Create (Cam)
Global HUD4%  = HUD_Create (Cam)
Global HUD5%  = HUD_Create (Cam)
Global HUD6%  = HUD_Create (Cam)

; LOAD FONTS & IMAGE RESOURCES
Global Font1%     = HUD_LoadFont ("Media\font1.png", "Media\font1.dat",4+256)
Global Font2%     = HUD_LoadFont ("Media\font2.png", "Media\font2.dat",4+256)
Global Resource1% = HUD_LoadImageResource ("Media\graphics.png", 4+256)
Global Resource2% = HUD_LoadImageResource ("Media\spiral.png", 4)
Global Resource3% = HUD_LoadImageResource ("Media\logo.png", 4)

; ------------------------------------------------------------------------
; INTRO
; ------------------------------------------------------------------------

Include "include - intro.bb"

; ------------------------------------------------------------------------
; TITLE LOOP
; ------------------------------------------------------------------------

; CREATE 3D BACKGROUND SCENE
Include "include - 3D scene.bb"

.TITLE

FlushKeys()
ShowEntity FighterPivot
RotateEntity Cam,-65,0,0
EntityTexture Planet,PlanetTex(Rand(1,4))
If show_backstage = 0 Then ShowBackground()

Include "include - title screen.bb"

; ------------------------------------------------------------------------
; GAME LOOP
; ------------------------------------------------------------------------

.GAME

; CREATE LAYERS
Lyr_Objects = HUD_CreateLayer(HUD1, Resource1) ; SHIP, COMETS, PICK-UPS
Lyr_Shots   = HUD_CreateLayer(HUD1, Resource1) ; SHOTS
Lyr_Bright  = HUD_CreateLayer(HUD1, Resource1) ; BRIGHT - EXPLOSIONS, SHIELD, THRUST
Lyr_Bars    = HUD_CreateLayer(HUD1)            ; BRIGHT - ENERGY BARS
Lyr_Text1   = HUD_CreateLayer(HUD1, Font1)     ; HUD TEXT SMALL
Lyr_Text2   = HUD_CreateLayer(HUD1, Font2)     ; HUD TEXT BIG
Lyr_Fader   = HUD_CreateLayer(HUD1)            ; BRIGHT - SCREEN FADER
Lyr_Top     = HUD_CreateLayer(HUD1, Resource1) ; PAUSE NOISE LAYER

HUD_SetLayerShadow Lyr_Objects,use_shadows, 6
HUD_SetLayerShadow Lyr_Text2  , True, 4
HUD_SetLayerBlend  Lyr_Bright , 3
HUD_SetLayerBlend  Lyr_Bars   , 3
HUD_SetLayerBlend  Lyr_Fader  , 3


FlushKeys() : HideEntity FighterPivot : If show_backstage = 0 Then HideBackground()

StartGame() 

Repeat

	If GameOverStuff() = True Then Exit

	GetDeltaTime
	

	second_frame = Not second_frame 
	ship_angle   = HUD_GetObjectRotation (Ship) 
	ship_x       = HUD_GetObjectX(Ship)
	ship_y       = HUD_GetObjectY(Ship)

	If game_over = 0 Then
		; --------------------------------------------------------
		; KEY CONTROLS
		; --------------------------------------------------------
		; ESC (PAUSE GAME)
		If KeyHit(1) Then PauseGame()

		; Q (QUIT GAME)
		If KeyHit(16) Then game_over = 1

		; SPACE (FIRE BOMB)
		If KeyHit(57) And bombs > 0 Then FireBomb()

		; LEFT / RIGHT (ROTATE) 
		If KeyDown(203) Then HUD_TurnObject Ship, -(ship_rotspeed * delta)
		If KeyDown(205) Then HUD_TurnObject Ship,  (ship_rotspeed * delta)

		; UP / DOWN (ACCELERATE) 
		If KeyDown(200) And fuel > 0 Then
			Thrust (1) : last_moved = now
		Else If KeyDown(208) And fuel > 0 Then
			Thrust (0) : last_moved = now
		Else
			; SHIP SLOW-DOWN
			ship_velx = ship_velx - (ship_velx / 198) * delta
			ship_vely = ship_vely - (ship_vely / 198) * delta
			HUD_FX_SteadyMove Ship, ship_velx, ship_vely, False
		End If

		; HIDE BURST?
		If KeyDown(200) = False And KeyDown(208) = False Or fuel <= 0 Then
			HUD_SetObjectVisibility Burst, False
			StopChannel Chn_Thrust
		End If

		; L-STRG (FIRE SHOT)
		If KeyHit(29) Or turboFire > 0 And KeyDown(29) Then

			If power_shots > 0 Then p% = 1 Else p% = 0

			; TURBO FIRE OFF
			If turboFire < 1 Then
				If double_shots > 0 Then
					double_shots = double_shots - 1
					CreateShot( ship_angle-7, p )
					CreateShot( ship_angle+7, p )
				Else 
					power_shots = power_shots  - 1 : If power_shots < 0 Then power_shots = 0
					CreateShot( ship_angle  , p )
				End If

			; TURBO FIRE ON
			Else If turboFire > 0 And now-turbo_last > turbo_pause Then
				turbo_last  = now
				turboFire   = turboFire - 1
				power_shots = power_shots  - 1 : If power_shots < 0 Then power_shots = 0
				If turboFire < 1 Then HUD_SetObjectVisibility Bar_Cannon, False : PlaySound Snd_Cannon_Off
				HUD_UpdateShape(Bar_Cannon, "PERCENTBAR", turboFire / (turboFireMax / 100),1, 0,0, ship_radius*2,7)
				CreateShot( ship_angle  , p )
			End If

			If missiles >= 2 And now-missile_last > missile_pause Then
				missile_last = now
				missiles     = missiles - 2
				CreateMissiles()
			End If
		End If ; L-CTRL
	End If ; NOT GAME OVER 

	; ----------------------------------------------------------------
	; UPDATE STUFF
	; ----------------------------------------------------------------
	DrawTrails
	UpdateShots
	UpdateEnemy
	UpdatePickups
	UpdateMissiles
	UpdateActiveWeapons
	; CHECK COLLISIONS EVERY 2ND FRAME ONLY
	If second_frame Then CheckCollisions

	; SHOW FPS
	HUD_SetText Txt_FPS, "FPS: " + SC_FPS

	; TURN CAMERA TO FACE PLANET
	AlignToVector Cam,0,65,0,2,.01 * delta

	; UPDATE HUD, 3D-BACKGROUND, RENDER
	HUD_Update : If time_freeze = 0 Then AnimateBackground()
	

	RenderWorld : Flip 0

Forever



Goto TITLE



; ------------------------------------------------------------------------
; FUNCTION: RESET VARIABLES, CREATE GAME SPRITES AND GAME HUD
; ------------------------------------------------------------------------
Function StartGame()

	; RESET GAME SETTINGS
	last_moved      = MilliSecs()
	ship_velx	= 0.0
	ship_vely	= 0.0
	shot_speed	= 5
	score		= 0
	fuel		= 100
	energy		= 100
	pickup_speed	= 20
	enemy_speed     = 100
	stage		= 0
	time_freeze	= 0
	time_shield	= 0
	power_shots	= 0
	double_shots    = 0
	missiles	= 0
	game_over	= 0
	comet_type	= -1
	turboFire	= 0

	; DIFFICULTY SETTINGS
	Select difficulty

	Case 1 
		num_comets	   = 1
		comet_speed	   = 25
		shot_power	   = 25
		missile_power      = 50
		laser_power        = 10
		bombs		   = 2
		pickup_chance	   = 40
		freeze_duration    = 5000
		shield_duration	   = 5000
		mace_duration      = 15000
		laser_duration     = 15000
		refuel_per_stage   = 75
		enemy_wait	   = 30000   
	Case 2 
		num_comets	   = 2
		comet_speed	   = 30
		shot_power	   = 20
		missile_power      = 40
		laser_power        = 5
		bombs		   = 1
		pickup_chance	   = 25
		freeze_duration    = 5000
		shield_duration	   = 5000
		mace_duration      = 15000
		laser_duration     = 15000
		refuel_per_stage   = 50
		enemy_wait	   = 20000   
	Case 3 
		num_comets	   = 3
		comet_speed	   = 35
		shot_power	   = 15
		laser_power        = 5
		missile_power      = 25
		bombs		   = 1
		pickup_chance	   = 25
		freeze_duration    = 5000
		shield_duration	   = 5000
		mace_duration      = 10000
		laser_duration     = 10000
		refuel_per_stage   = 25
		enemy_wait	   = 10000   
	End Select

	Local Tmp%

	; CREATE PLAYER SHIP
	Ship%             = HUD_CreateImage (Lyr_Objects, 400,300 , 72,41, 80,79)
	ship_radius       = (HUD_GetObjectWidth(Ship) / 2) - 10 ; GIVE A TOLERANCE OF 10 PIXELS FOR COLLISIONS
	HUD_SetObjectAlpha  Ship, 0
	HUD_SetObjectScale  Ship, 3.5,3.5
	HUD_FX_Scale        Ship, .8, .8, 2000
	HUD_FX_AlphaFade    Ship, 1,1000

	; CREATE ENEMY SHIP
	Enemy = HUD_CreateImage (Lyr_Objects, -500,-500 , 1,943, 78,78)
	HUD_SetObjectScale Enemy, .8, .8
	enemy_radius = HUD_GetObjectWidth(Enemy) / 2
	
	; CREATE MACE
	Mace = HUD_CreateImage (Lyr_Objects, 400,300 , 1,368, 87,89)
	HUD_SetObjectScale Mace, .6, .6
	mace_radius = HUD_GetObjectWidth(Mace) / 2
	HUD_SetObjectVisibility Mace, False ; HIDE
	
	; CREATE MACE LINE
	MaceLine = HUD_CreateShape  (Lyr_Objects,"LINE" , 2,0, 320,280, 330,290)
	HUD_SetObjectColor      MaceLine, 200,200,200
	HUD_SetObjectVisibility MaceLine, False ; HIDE
	
	; CREATE LASER
	Laser = HUD_CreateShape  (Lyr_Bright,"RECTANGLE" , 1,0, 320, 240, 4,1500) ; FILLED
	HUD_SetObjectOrigin      Laser, 0,1
	HUD_SetObjectGradient    Laser, 50,50,255, 100,255,100, 1
	HUD_SetObjectVisibility  Laser, False ; HIDE
	

	LaserFlare = HUD_CreateImage (Lyr_Bright, 320,240 , 212,68, 62,62)
	HUD_SetObjectColor      LaserFlare, 200,200,255, .75
	HUD_SetObjectVisibility LaserFlare, False ; HIDE

	; DISPLAY ENEMY ENERGY BAR?
	If show_bars Then
		Bar_Enemy = HUD_CreateShape(Lyr_Bars, "PERCENTBAR", enemy_energy,1, 0,0, enemy_radius*2,7)
		HUD_SetObjectColor  Bar_Enemy, 0,100,0
		HUD_FX_FollowObject Bar_Enemy, Enemy, 0,-(enemy_radius*1.25 + 5)
	End If

	; CREATE HYPER CANNON PERCENTAGE BAR
	Bar_Cannon% = HUD_CreateShape(Lyr_Bars,"PERCENTBAR", 100,1, 0,0, ship_radius*2,7)
	HUD_FX_FollowObject     Bar_Cannon, Ship, 0, ship_radius + 5
	HUD_SetObjectVisibility Bar_Cannon, False ; HIDE

	; CREATE PLAYER SHIP BURST
	Burst%           = HUD_CreateImage (Lyr_Bright, 400,300 , 286,40, 42,25)
	HUD_SetObjectScale Burst,.80,1
	HUD_FX_SmoothBlink Burst, 1, 0, 50

	; CREATE PLAYER SHIELD
	Shield%               = HUD_CreateImage (Lyr_Bright, 400,300 , 330,39, 64,64)
	HUD_SetObjectScale      Shield,1.3,1.3
	HUD_SetObjectColor      Shield,200,200,255,.7
	HUD_SetObjectVisibility Shield,False ; HIDE

	; ENERGY & FUEL BAR
	Tmp% = HUD_CreateShape (Lyr_Bars,"RECTANGLE" , 0,1, 10,0, 10,bar_height, "","BOTTOM-90") 
	Bar_Energy           = HUD_CreateShape (Lyr_Bars,"RECTANGLE", 1,0, 0,0, 0,0)
	HUD_SetObjectColor     Bar_Energy, 255,100,0,.75
	
	Tmp% = HUD_CreateShape (Lyr_Bars,"RECTANGLE" , 0,1, 22,0, 10,bar_height, "","BOTTOM-90") 
	Bar_Fuel             = HUD_CreateShape (Lyr_Bars,"RECTANGLE", 1,0, 0,0, 0,0)
	HUD_SetObjectColor     Bar_Fuel, 100,255,100,.75

	; ENERGY & FUEL BAR TEXTS

	Tmp% = HUD_CreateText  (Lyr_Text1, 0,0,  "FUEL","LEFT",0,"LEFT+23","BOTTOM-15")
	HUD_SetObjectRotation  Tmp,-90

	Tmp% = HUD_CreateText  (Lyr_Text1, 0,0,  "ENERGY","LEFT",0,"LEFT+10","BOTTOM-15")
	HUD_SetObjectRotation  Tmp,-90

	; HUD TEXTS
	Local scr$ = Str(score) : While Len(scr$) < 6 : scr$ = "0" + scr$ : Wend
	Txt_Score%    = HUD_CreateText (Lyr_Text2, 5,0,   "SCORE: " + scr$, "LEFT",0, "","TOP+10")
	Txt_Bombs%    = HUD_CreateText (Lyr_Text2, 220,0, "BOMBS: " + bombs,"LEFT",0, "","TOP+10")
	Txt_Missiles% = HUD_CreateText (Lyr_Text2, 360,0, "MISSILES: " + missiles,"LEFT",0, "","TOP+10")
	Txt_Stage%    = HUD_CreateText (Lyr_Text2, 530,0, "STAGE: " + stage,"LEFT",0, "","TOP+10")
	Txt_FPS%      = HUD_CreateText (Lyr_Text1, 0,0,   "FPS: ","RIGHT",0, "RIGHT","TOP+10")

	; FADER

	Fader% = HUD_CreateShape (Lyr_Fader,"RECTANGLE" , 1,0, 0,0, screen_width,screen_height, "CENTER","CENTER") 
	HUD_SetObjectColor Fader, 255,255,255,0
	
	; INGAME MUSIC
	Chn_GameMusic = PlaySound (Snd_GameMusic)
	
	; NEXT STAGE MESSAGE
	NextStage()
	
End Function


; ------------------------------------------------------------------------
; FUNCTION: NEXT STAGE
; ------------------------------------------------------------------------
Function NextStage()

	PlaySound Snd_NextStage
	stage = stage + 1
	fuel  = fuel  + refuel_per_stage : If fuel > 100 Then fuel = 100
	UpdateDisplay()
	
	; EVERY THIRD STAGE:
	If stage > 1 And stage Mod 3 Then num_comets = num_comets + 1
	
	; CHANGE COMETS LOOK
	comet_type = comet_type + 1 : If comet_type > 4 Then comet_type = 0

	; MAKE COMETS A LITTLE FASTER
	comet_speed = comet_speed + 3

	; CREATE COMETS AT SCREEN CORNERS
	For i% = 1 To num_comets : CreateComet(Rand(0,1)*screen_width,Rand(0,1)*screen_height,5) : Next
	
	; GIVE MESSAGE
	Local Tmp% = HUD_CreateText (Lyr_Text2, 5,0, "APPROACHING STAGE " + stage, "CENTER",0, "CENTER","CENTER")
	HUD_FX_Blink      Tmp, 100,100,2000
	HUD_FX_AlphaFade  Tmp, 0,2000,4000
	HUD_FX_AutoRemove Tmp, 6000
	
End Function


; ------------------------------------------------------------------------
; FUNCTION: UPDATE BARS & SCORE TEXT
; ------------------------------------------------------------------------
Function UpdateDisplay()

	; ENERGY BAR
	HUD_UpdateShape (Bar_Energy,"RECTANGLE" , 1,0, 10,0, 8,energy * (bar_height/100), "","BOTTOM-90") 

	; FUEL BAR
	HUD_UpdateShape (Bar_Fuel,"RECTANGLE" , 1,0, 22,0, 8,fuel * (bar_height/100), "","BOTTOM-90") 

	; ENERGY OR FUEL LOW?
	If energy <= 25 Then HUD_FX_Blink Bar_Energy,250,250 Else HUD_ClearEffects Bar_Energy
	If fuel   <= 25 Then HUD_FX_Blink Bar_Fuel  ,250,250 Else HUD_ClearEffects Bar_Fuel

	; HUD TEXTS
	Local scr$ = Str(score) : While Len(scr$) < 6 : scr$ = "0" + scr$ : Wend
	HUD_SetText Txt_Score,   "SCORE: " + scr$
	HUD_SetText Txt_Bombs,   "BOMBS: " + bombs
	HUD_SetText Txt_Missiles,"MISSILES: " + missiles
	HUD_SetText Txt_Stage,   "STAGE: " + stage

End Function


; ------------------------------------------------------------------------
; FUNCTION: PAUSE GAME
; ------------------------------------------------------------------------
Function PauseGame()

	Local time% = now : FlushKeys
	PauseChannel Chn_Thrust
	PauseChannel Chn_Enemy
	PauseChannel Chn_Thrust
	PauseChannel Chn_Shield
	PauseChannel Chn_GameMusic
	PauseChannel Chn_Mace
	PauseChannel Chn_Laser

	; PAUSE EXISTING EFFECTS & ANIMATIONS
	HUD_PauseEffects	 ; ALL
	HUD_PauseImageAnimations ; ALL

	; TEXT
	Local Txt% = HUD_CreateText(Lyr_Text2, 0,0, "+ MADNESS PAUSED +|ANY KEY TO CONTINUE", "CENTER",0, "CENTER","CENTER-50")
	HUD_FX_Blink Txt,1000,500

	; SHOW STATIC NOISE
	Local Noise%     = HUD_CreateTiledImage (Lyr_Top, 0,0 , screen_width, screen_height, 156,434, 117,58, "CENTER","CENTER")
	HUD_AnimateImage   Noise, 156,434, 3,3, "NORMAL", 0, 75
	HUD_SetObjectColor Noise,255,150,0,0
	HUD_FX_AlphaFade   Noise,.4,2000

	; WAIT LOOP
	Repeat : HUD_Update : RenderWorld  : Flip 1 : Until GetKey()
	
	; UPDATE FREEZE OR SHIELD TIME
	If time_freeze > 0 Then time_freeze = time_freeze + (MilliSecs()-time)
	If time_shield > 0 Then time_shield = time_shield + (MilliSecs()-time)
	If time_mace   > 0 Then time_mace   = time_mace   + (MilliSecs()-time)

	; CONTINUE
	FlushKeys
	ResumeChannel Chn_Thrust
	ResumeChannel Chn_Enemy
	ResumeChannel Chn_Thrust
	ResumeChannel Chn_Shield
	ResumeChannel Chn_GameMusic
	ResumeChannel Chn_Mace
	ResumeChannel Chn_Laser
	HUD_FX_AlphaFade   Noise,0,1000
	HUD_FX_AutoRemove  Noise,1000
	HUD_RemoveObject   Txt
	HUD_ResumeEffects
	HUD_PlayImageAnimations
	
End Function



; ------------------------------------------------------------------------
; FUNCTION: CREATE RANDOM PARTICLES
; ------------------------------------------------------------------------
Function CreateParticles(x%, y%, num%)

	Local i%, Tmp%
	For i = 1 To num
		Tmp = HUD_CreateImage (Lyr_Bright, x,y, 344,180, 30,30)
		HUD_SetObjectRotation Tmp, Rand(0,360)
		HUD_SetObjectScale    Tmp, .1, .1
		HUD_FX_SteadyMove     Tmp, 0,Rand(50,150),True,True
		HUD_FX_AlphaFade      Tmp, 0,500,500
		HUD_FX_AutoRemove     Tmp, 1000
	Next

End Function


; ------------------------------------------------------------------------
; FUNCTION: CREATE A COMET
; ------------------------------------------------------------------------
Function CreateComet(x%, y%, size%, typ%=0)

	; DON'T PLACE SMALL ONES TOO FAR OUTSIDE
	If size < 4 Then

		If x < 25 Then x = 25
		If y < 25 Then y = 25
		If x > screen_width  - 25 Then x = screen_width  - 25
		If y > screen_height - 25 Then y = screen_height - 25
	End If

	; NEW COMET
	Local Comet.TComet
	Comet.TComet   = New TComet
	Comet\size     = size
	Comet\shield   = size * 25
	Comet\ObjectID = HUD_CreateImage (Lyr_Objects, x,y, comet_type*96,512, 96,96)
	Comet\angle    = Rnd(25,335)

	; LET BIGGEST COMETS FLY TO CENTER FIRST
	If size = 5 Then
		Comet\angle = 90 + ATan2((screen_height/2)-y, (screen_width/2)-x)
		If Comet\angle < 0 Comet\angle = Comet\angle + 360
	End If
	
	HUD_SetObjectScale  Comet\ObjectID , size * .20, size * .20 
	HUD_FX_SteadyRotate Comet\ObjectID , Rand (-90,90)
	HUD_FX_SteadyMove   Comet\ObjectID , Cos(-90 + Comet\angle) * comet_speed , Sin(-90 + Comet\angle) * comet_speed, False

	; COMET RADIUS (FOR COLLISION CHECK)
	Comet\radius = HUD_GetObjectWidth(Comet\ObjectID, True) / 2

	; DISPLAY ENERGY BARS?
	If show_bars Then
		Comet\Bar = HUD_CreateShape(Lyr_Bars, "PERCENTBAR", Comet\shield,1, 0,0, Comet\radius*2,7)
		HUD_SetObjectColor  Comet\Bar, 0,100,0
		HUD_FX_FollowObject Comet\Bar, Comet\ObjectID, 0,-(Comet\radius*1.25 + 5)
	End If
	
	; TIME-FREEZE ACTIVE?
	If time_freeze > 0 Then
		HUD_PauseEffects Comet\ObjectID
		If Comet\Bar Then HUD_PauseEffects Comet\Bar
	End If

End Function


; ------------------------------------------------------------------------
; FUNCTION: COMET HAS BEEN HIT
; ------------------------------------------------------------------------
Function CometHit (CometID, shot_type%=0) ; 0 = NORMAL, 1 = POWERSHOT, 2 = MISSILE, 3 = LASER

	Local Comet.TComet = Object.TComet(CometID)
	Local cx% = HUD_GetObjectX(Comet\ObjectID)
	Local cy% = HUD_GetObjectY(Comet\ObjectID)
	Local a#

	If shot_type = 3 Then Comet\shield = Comet\shield - laser_power
	If shot_type = 2 Then Comet\shield = Comet\shield - missile_power
	If shot_type = 1 Then Comet\shield = 0
	If shot_type = 0 Then Comet\shield = Comet\shield - shot_power

	; COMET NOT DESTROYED YET?
	If Comet\shield > 0 Then
		
		; HIT BY LASER
		If shot_type  = 3 Then PlaySound Snd_LaserHit
		; OTHER WEAPON
		If shot_type <> 3 Then PlaySound Snd_CHit : HUD_FX_Rumble Comet\ObjectID, 5,500
		
		; UPDATE ENERGY BAR
		If Comet\Bar Then HUD_UpdateShape Comet\Bar, "PERCENTBAR", Comet\shield,1, 0,0, Comet\radius*2,7

	; COMET WRECKED
	Else
		; EXPLOSION
		PlaySound Snd_CExplode
		CreateExplosion (cx, cy, .5 + Comet\size * .5)
		HUD_FX_Rumble HUD1, 10,500
		
		; PARTICLES (DEPENDS ON CURRENT FPS)
		If SC_FPS >  80 Then CreateParticles (cx,cy, 20)
		If SC_FPS > 130 Then CreateParticles (cx,cy, 30)
		If SC_FPS > 150 Then CreateParticles (cx,cy, 40)

		; SPLIT INTO SMALLER COMETS?
		If Comet\size > 1 Then
			score = score + 25
			CreateComet ( cx + Rand(-25,25), cy + Rand(-25,25), Comet\size-1)
			CreateComet ( cx + Rand(-25,25), cy + Rand(-25,25), Comet\size-1)
		; DESTROYED COMPLETELY
		Else
			score = score + 75
			If pickup_chance > Rand(1,100) Then CreatePickup (cx, cy)
		End If

		; REMOVE THIS COMET
		HUD_RemoveObject Comet\ObjectID
		If Comet\Bar Then HUD_RemoveObject Comet\Bar
		Delete Comet

		; COUNT COMETS (NEXT STAGE?)
		Local comets% = 0
		For Comet.TComet = Each TComet : comets = comets + 1 : Exit : Next
		If  comets = 0 And game_over = 0 Then NextStage()

		; SCORE ETC.
		UpdateDisplay()
	End If
	
End Function


; ------------------------------------------------------------------------
; FUNCTION: PLAYER HAS BEEN HIT
; ------------------------------------------------------------------------
Function PlayerHit(damage%)

	; SHIELD ACTIVE?
	If HUD_GetObjectVisibility(Shield) = True Then Return

	PlaySound Snd_Collide
	HUD_FX_Rumble HUD1, 10,500 
	CreateExplosion (HUD_GetObjectX(Ship), HUD_GetObjectY(Ship), 1.5)
	
	; RESET TO SCREEN CENTER?
	If center_player Then
		ship_velx = Cos(-90 + ship_angle) * (10 * ship_accel)
		ship_vely = Sin(-90 + ship_angle) * (10 * ship_accel)
		HUD_PositionObject Ship, Int(screen_width/2), Int(screen_height/2)
	; REVERSE PLAYER DIRECTION
	Else
		ship_velx = ship_velx * -1
		ship_vely = ship_vely * -1
	End If

	HUD_FX_SteadyMove Ship, ship_velx, ship_vely, False
	HUD_FX_Blink  Ship, 50,50,2000 ; MAKE INVULNERABLE (BLINK)
	
	Local e# = energy : energy = energy - damage
	If energy <= 0 Then
		; GAME OVER?
		energy = 0 : game_over = 1
	; ENERGY WARNING

	Else If e > 25 And energy < 25 Then
		Local Txt% = HUD_CreateText(Lyr_Text2, 0,0, "+ ENERGY LOW +", "CENTER",0, "CENTER","CENTER")
		HUD_FX_Blink Txt,250,250
		HUD_FX_AutoRemove Txt,3000
		PlaySound Snd_Warning
	End If

	UpdateDisplay ()
	
End Function


; ------------------------------------------------------------------------
; FUNCTION: CREATE A SHOT
; ------------------------------------------------------------------------
Function CreateShot(dir%, powershot% = 0, isBomb% = False )

	Local Shot.TShot
	Shot.TShot     = New TShot
	Shot\powershot = powershot


	If powershot < 1 Then
		; CREATE NORMAL SHOT
		PlaySound Snd_Shot1
		Shot\ObjectID = HUD_CreateImage (Lyr_Shots, 0,0, 207,40, 8,8)
	Else
		; CREATE POWER SHOT (BOMB)
		If isBomb     = False Then PlaySound Snd_Shot2
		Shot\ObjectID = HUD_CreateImage (Lyr_Shots, 0,0, 227,40, 8,15)
	End If

	HUD_PositionObject    Shot\ObjectID, HUD_GetObjectX(Ship), HUD_GetObjectY(Ship)
	HUD_SetObjectRotation Shot\ObjectID, dir
	HUD_MoveObject        Shot\ObjectID, 0,-20,True ; PLACE AT SHIP NOSE

End Function


; ------------------------------------------------------------------------
; FUNCTION: MOVE SHOTS
; ------------------------------------------------------------------------
Function UpdateShots()

	Local Shot.TShot
	For   Shot.TShot = Each TShot
		HUD_MoveObject Shot\ObjectID, 0,-(shot_speed * delta),True
		; REMOVE IF OUTSIDE SCREEN
		Local x% = HUD_GetObjectX(Shot\ObjectID)
		Local y% = HUD_GetObjectY(Shot\ObjectID)
		If x < 0 Or x > screen_width Or y < 0 Or y > screen_height
			HUD_RemoveObject Shot\ObjectID
			Delete Shot
		End If		
	Next
End Function


; ------------------------------------------------------------------------
; FUNCTION: CREATE A MISSILE
; ------------------------------------------------------------------------
Function CreateMissiles( )

	Local Missile.TMissile, i%, a% = -1
	
	For i = 1 To 2
		Missile.TMissile = New TMissile
		Missile\ObjectID = HUD_CreateImage (Lyr_Shots, 0,0, 233,181, 36,42)
		HUD_SetObjectScale Missile\ObjectID, .6,.6

		Missile\radius   = HUD_GetObjectHeight(Missile\ObjectID) / 2

		; PLACE MISSILE

		HUD_PositionObject    Missile\ObjectID, HUD_GetObjectX(Ship), HUD_GetObjectY(Ship)
		HUD_SetObjectRotation Missile\ObjectID, ship_angle
		HUD_MoveObject        Missile\ObjectID, a*30,0, True ; PLACE LEFT OR RIGHT
		a = Abs(a)

		HUD_FX_SteadyMove Missile\ObjectID, 0,-350, True 
		GetMissileTarget Missile
	Next

	

	PlaySound Snd_Missile

End Function


; ------------------------------------------------------------------------
; FUNCTION: FIND MISSILE TARGET
; ------------------------------------------------------------------------
Function GetMissileTarget( Missile.TMissile )

	Local Comet.TComet

	For Comet = Each TComet
		If Comet\aimed = 0 Then Exit
	Next
	
	; NONE FOUND? GET FIRST
	If Comet = Null Then Comet = First TComet

	If Comet <> Null Then
		Comet\aimed = 1
		Missile\CometID  = Handle(Comet)
		Missile\TargetID = Comet\ObjectID
		HUD_FX_FaceObject  Missile\ObjectID, Missile\TargetID, 3
	End If

End Function


; ------------------------------------------------------------------------
; FUNCTION: UPDATE MISSILES
; ------------------------------------------------------------------------
Function UpdateMissiles()

	Local Comet.TComet
	Local Missile.TMissile
	For   Missile.TMissile = Each TMissile
		; NEEDS NEW TARGET?
		Comet = Null
		Comet = Object.TComet(Missile\CometID)
		If Comet = Null Then GetMissileTarget Missile
	Next
		
End Function


; ------------------------------------------------------------------------
; FUNCTION: DRAW SMOKE TRAILS ETC.
; ------------------------------------------------------------------------
Function DrawTrails()

	; IT'S TIME FOR TRAILS?
	If now - trails_last < trails_pause Then Return Else trails_last = now
	

	Local Tmp%

	; DRAW MISSILE SMOKE TRAIL?
	Local Missile.TMissile
	For   Missile.TMissile = Each TMissile
		If trails_last = now Then
			Tmp    = HUD_CreateImage (Lyr_Bright, 0,0, 274,181, 30,30)
			HUD_PositionObject    Tmp, HUD_GetObjectX(Missile\ObjectID), HUD_GetObjectY(Missile\ObjectID)
			HUD_SetObjectRotation Tmp, Rand(0,360)
			HUD_SetObjectScale    Tmp, .5,.5
			HUD_SetObjectColor    Tmp, 175,175,255,.75
			HUD_FX_Scale          Tmp, 2,2,1500
			HUD_FX_AlphaFade      Tmp, 0,2000
			HUD_FX_AutoRemove     Tmp, 2000
		End If
	Next
	
	; DRAW MACE WEAPON TRAIL
	If time_mace > 0 Then
		Tmp = HUD_CreateImage (Lyr_Objects, 400,300 , 1,368, 87,89)
		HUD_PositionObject Tmp, HUD_GetObjectX(Mace),      HUD_GetObjectY(Mace)
		HUD_SetObjectScale Tmp, HUD_GetObjectScaleX(Mace), HUD_GetObjectScaleY(Mace)
		HUD_SetObjectAlpha Tmp, .4
		HUD_FX_AlphaFade   Tmp, 0,500
		HUD_FX_AutoRemove  Tmp, 500
	End If

End Function


; ------------------------------------------------------------------------
; FUNCTION: CREATE A PICK-UP ITEM
; ------------------------------------------------------------------------
Function CreatePickup(x%, y%)

	If pickups_enabled = False Then Return

	Local Pickup.TPickup
	Pickup.TPickup = New TPickup
	
	; SET PICKUP TYPE
	Local typ% = Rand(0,11)
	Pickup\typ$    = pickup_types$( typ% )
	Pickup\ObjectID= HUD_CreateImage (Lyr_Objects, x,y, typ*37,141, 37,37)
	If Pickup\typ$ = "ENERGY+" 	 Then HUD_SetObjectColor Pickup\ObjectID, 255,150,150
	If Pickup\typ$ = "POWER SHOT" 	 Then HUD_SetObjectColor Pickup\ObjectID, 150,150,255
	If Pickup\typ$ = "FUEL+" 	 Then HUD_SetObjectColor Pickup\ObjectID, 150,255,150
	If Pickup\typ$ = "TIME FREEZE" 	 Then HUD_SetObjectColor Pickup\ObjectID, 255,255,150
	If Pickup\typ$ = "DOUBLE SHOT" 	 Then HUD_SetObjectColor Pickup\ObjectID, 150,255,255
	If Pickup\typ$ = "KILLER SHIELD" Then HUD_SetObjectColor Pickup\ObjectID, 255,200,100
	If Pickup\typ$ = "HYPER CANNON"  Then HUD_SetObjectColor Pickup\ObjectID, 255,155,75
	If Pickup\typ$ = "MISSILES+"     Then HUD_SetObjectColor Pickup\ObjectID, 150,150,150
	If Pickup\typ$ = "IRON MACE"     Then HUD_SetObjectColor Pickup\ObjectID, 230,180,0
	If Pickup\typ$ = "POWER LASER"   Then HUD_SetObjectColor Pickup\ObjectID, 200,200,255
	If Instr (Pickup\typ$, "BOMB") 	 Then HUD_SetObjectColor Pickup\ObjectID, 255,150,255

	HUD_SetObjectScale  Pickup\ObjectID, .8, .8
	
	; REMEMBER PICKUP RADIUS (COLLISION CHECK)
	Pickup\radius  = HUD_GetObjectWidth(Pickup\ObjectID) / 2

	HUD_FX_SteadyRotate Pickup\ObjectID, Rand(-180,180)
	HUD_FX_SteadyMove   Pickup\ObjectID, Cos (Rand(0,360) ) * pickup_speed , Sin( Rand(0,360) ) * pickup_speed, False

	; LET PICKUP FLASH AFTER A WHILE, THEN ZOOM OUT
	HUD_FX_SmoothBlink  Pickup\ObjectID, 1,.25, 100, 4000,6000
	HUD_FX_Scale        Pickup\ObjectID, 0,0, 2000, 0,0, 10000

	; TIME FREEZE ACTIVE? -DON'T MOVE
	If time_freeze > 0 Then HUD_PauseEffects Pickup\ObjectID

End Function


; ------------------------------------------------------------------------
; FUNCTION: REMOVE EXPIRED PICKUPS, CHECK PLAYER-PICKUP COLLISION
; ------------------------------------------------------------------------
Function UpdatePickups()

	Local Pickup.TPickup, px%
	Local sx% = HUD_GetObjectX(Ship)
	Local sy% = HUD_GetObjectY(Ship)
	Local Txt%, Tmp%
	
	For Pickup.TPickup = Each TPickup

		; REMOVE PICKUP?
		If HUD_CountEffects (Pickup\ObjectID, "Scale") = 0
			HUD_RemoveObject Pickup\ObjectID
			Delete Pickup : Return
		End If
		
		; GRABBED BY PLAYER?
		px% = HUD_GetObjectX(Pickup\ObjectID)
		py% = HUD_GetObjectY(Pickup\ObjectID)
		If px > sx - 50 And px < sx + 50 

			If HUD_GetObjectDistance (Pickup\ObjectID, Ship) < Pickup\radius + ship_radius Then
				CreateExplosion (px, py, 1.0, True) ; RING
				PlaySound Snd_Pickup
				
				; GIVE WHAT?
				If Pickup\typ$ = "POWER SHOT"    Then power_shots  = 20
				If Pickup\typ$ = "BOMB+"         Then bombs = bombs + 1
				If Pickup\typ$ = "DOUBLE SHOT"   Then double_shots = 20
				If Pickup\typ$ = "FUEL+"         Then fuel = fuel + 25 : If fuel > 100 Then fuel = 100
				If Pickup\typ$ = "ENERGY+"       Then energy = energy + 25 : If energy > 100 Then energy = 100
				If Pickup\typ$ = "TIME FREEZE"   Then Freeze()
				If Pickup\typ$ = "HYPER CANNON"  Then ActivateHyperCannon()
				If Pickup\typ$ = "INSTANT BOMB"  Then bombs = bombs + 1  : FireBomb()
				If Pickup\typ$ = "KILLER SHIELD" Then ActivateShield()
				If Pickup\typ$ = "MISSILES+"     Then missiles = missiles + 50
				If Pickup\typ$ = "IRON MACE"     Then ActivateMace()
				If Pickup\typ$ = "POWER LASER"   Then ActivateLaser()
				UpdateDisplay ()
				
				; SHOW PICKUP TEXT
				Txt = HUD_CreateText (Lyr_Text2, sx,sy, Pickup\typ$,"CENTER",0)
				HUD_FX_SteadyMove   Txt,0,-50
				HUD_SetObjectScale  Txt,.25,.25
				HUD_FX_Scale        Txt,1.5,1.5, 450, 14
				HUD_FX_AlphaFade    Txt,0,1000,1000
				HUD_FX_AutoRemove   Txt,2000
				
				; REMOVE PICKUP
				HUD_RemoveObject Pickup\ObjectID
				Delete Pickup : Return
			End If

		End If
	Next

End Function


; ------------------------------------------------------------------------
; FUNCTION: CREATE AN EXPLOSION
; ------------------------------------------------------------------------
Function CreateExplosion(x%, y%, scale%, pickup% = False)

	Local Tmp% 
	
	; PICKUP RING
	If pickup Then
		Tmp = HUD_CreateImage (Lyr_Bright, x,y, 396,40, 95,95)
		HUD_SetObjectRotation Tmp, Rand(0,180) + Rand(0,180)
		HUD_SetObjectColor    Tmp, 150,150,255,1
		HUD_SetObjectScale    Tmp, .1,.1
		HUD_FX_Scale          Tmp, 1.75,1.75, 500
		HUD_FX_AlphaFade      Tmp, 0,400	; FADE OUT
		HUD_FX_AutoRemove     Tmp, 400		; REMOVE AUTOMATICALLY
		Return
	End If

	; SMOKE
	Tmp%  = HUD_CreateImage (Lyr_Bright, x,y, 274,181, 30,30)
	HUD_SetObjectRotation Tmp, Rand(0,360)
	HUD_SetObjectScale    Tmp, 1,1
	HUD_SetObjectColor    Tmp, 150,150,255,.75
	HUD_FX_Scale          Tmp, 3,3,2000
	HUD_FX_AlphaFade      Tmp, 0,2500
	HUD_FX_AutoRemove     Tmp, 2500

	; DARK CLOUD
	Tmp = HUD_CreateImage (Lyr_Objects, x,y, 0,614, 71,92)
	HUD_SetObjectScale    Tmp, scale + .20, scale + .20
	HUD_AnimateImage      Tmp, 0,614, 14,7, "NORMAL", 1, 65
	HUD_SetObjectRotation Tmp, Rand(0,180) + Rand(0,180)
	HUD_SetObjectColor    Tmp, 50,50,50,.5
	HUD_FX_AlphaFade      Tmp, 0,900,300	; FADE OUT
	HUD_FX_AutoRemove     Tmp, 1105		; REMOVE AUTOMATICALLY

	; RED CLOUD
	Tmp = HUD_CreateImage (Lyr_Bright, x+Rand(-15,15),y+Rand(-15,15), 0,614, 71,92)
	HUD_SetObjectScale    Tmp, scale + .25, scale + .25
	HUD_AnimateImage      Tmp, 0,614, 14,7, "NORMAL", 1, 65
	HUD_SetObjectRotation Tmp, Rand(0,180) + Rand(0,180)
	HUD_SetObjectColor    Tmp, 125,25,0,.75
	HUD_FX_AutoRemove     Tmp, 1105		; REMOVE AUTOMATICALLY

	; BRIGHT CLOUD
	Tmp = HUD_CreateImage (Lyr_Bright, x,y, 0,614, 71,92)
	HUD_SetObjectScale    Tmp, scale, scale
	HUD_AnimateImage      Tmp, 0,614, 14,7, "NORMAL", 1, 55
	HUD_SetObjectRotation Tmp, Rand(0,180) + Rand(0,180)
	HUD_FX_AutoRemove     Tmp, 935		; REMOVE AUTOMATICALLY

End Function


; ------------------------------------------------------------------------
; FUNCTION: ALL THE ENEMY SHIP STUFF IS HERE:
; ------------------------------------------------------------------------
Function UpdateEnemy()

	Local ex% = HUD_GetObjectX(Enemy)
	Local ey% = HUD_GetObjectY(Enemy)
	Local en% = enemy_energy

	; DO NOTHING?
	If game_over > 0 Then Return Else If ex = -500 And now-last_moved < enemy_wait Then Return

	last_moved = now

	; ACTIVATE NOW?
	If ex = -500 Then
		enemy_energy = 100
		Chn_Enemy = PlaySound(Snd_Enemy)
		If Bar_Enemy Then HUD_UpdateShape Bar_Enemy, "PERCENTBAR", enemy_energy,1, 0,0, enemy_radius*2,7
		HUD_SetObjectVisibility Enemy, True
		HUD_PositionObject      Enemy, Rand(0,1)*screen_width,Rand(0,1)*screen_height
		HUD_FX_FaceObject       Enemy, Ship, 6
		HUD_FX_SteadyMove       Enemy, 0,-enemy_speed, True
		Return

	; ALREADY IN ACTION?
	Else
		; CHECK SHOTS
		Local Shot.TShot, sx%, sy%
		For   Shot.TShot = Each TShot
			sx = HUD_GetObjectX(Shot\ObjectID)
			sy = HUD_GetObjectY(Shot\ObjectID)
			If sx > ex - 50 And sx < ex + 50 
				If HUD_GetObjectDistance (Enemy, Shot\ObjectID) < enemy_radius + 4 Then ; 4 = SHOT WIDTH / 2 (THE RADIUS)
					; DECREASE ENERGY
					enemy_energy = enemy_energy - shot_power/3
					; REMOVE SHOT (IF NOT POWER-SHOT)
					If Shot\powershot < 1 Then HUD_RemoveObject Shot\ObjectID : Delete Shot
					Exit
				End If
			End If
		Next

		; CHECK MISSILES
		Local Comet.TComet
		Local Missile.TMissile
		For   Missile.TMissile = Each TMissile
			sx% = HUD_GetObjectX(Missile\ObjectID)
			sy% = HUD_GetObjectY(Missile\ObjectID)
			If sx > ex - 50 And sx < ex + 50 
				If HUD_GetObjectDistance (Enemy, Missile\ObjectID) < enemy_radius + Missile\radius Then
					; DECREASE ENERGY
					enemy_energy = enemy_energy - missile_power/3
					; RESET TARGET COMET, IF ANY
					Comet = Object.TComet (Missile\CometID) : If Comet <> Null Then Comet\aimed = 0
					; REMOVE MISSILE
					HUD_RemoveObject Missile\ObjectID : Delete Missile
					Exit
				End If
			End If
		Next

		; CHECK PLAYER
		If HUD_CountEffects (Ship, "Blink") = 0
			If HUD_GetObjectDistance (Enemy, Ship) < enemy_radius + ship_radius Then
				enemy_energy = enemy_energy - 25
				PlayerHit(10)
			End If
		End If

		; CHECK MACE WEAPON
		If time_mace > 0 Then
			If HUD_GetObjectDistance (Enemy, Mace) < enemy_radius + mace_radius Then
				enemy_energy = enemy_energy - 1
				StopChannel Chn_MaceHit
				Chn_MaceHit = PlaySound (Snd_MaceHit)
			End If
		End If
		
		; CHECK LASER
		If time_laser > 0 Then
			If HUD_ObjectHitsObject (Laser, Enemy) Then enemy_energy = 0
		End If
	End If

	; HIT?
	If enemy_energy <> en Then
		If enemy_energy > 0 Then
			PlaySound Snd_CHit
			CreateExplosion (ex, ey, 1)
			If Bar_Enemy <> 0 Then HUD_UpdateShape Bar_Enemy, "PERCENTBAR", enemy_energy,1, 0,0, enemy_radius*2,7
		Else
			StopChannel Chn_Enemy
			PlaySound   Snd_CExplode
			CreateExplosion (ex, ey, 2)
			HUD_ClearEffects        Enemy
			HUD_SetObjectVisibility Enemy, False
			HUD_PositionObject      Enemy, -500,-500
		End If
	End If
	
End Function


; ------------------------------------------------------------------------
; FUNCTION: FREEZE OBJECTS (TIME FREEZE PICKUP)
; ------------------------------------------------------------------------
Function Freeze()
	Local Comet.TComet, Pickup.TPickup
	time_freeze = now : PlaySound Snd_Freeze
	For Comet.TComet   = Each TComet  : HUD_PauseEffects Comet\ObjectID  : Next
	For Pickup.TPickup = Each TPickup : HUD_PauseEffects Pickup\ObjectID : Next
End Function


; ------------------------------------------------------------------------
; FUNCTION: UNFREEZE OBJECTS (TIME FREEZE PICKUP)
; ------------------------------------------------------------------------
Function UnFreeze()
	Local Comet.TComet, Pickup.TPickup
	time_freeze = 0 : PlaySound Snd_Unfreeze
	For Comet.TComet   = Each TComet  : HUD_ResumeEffects Comet\ObjectID  : Next
	For Pickup.TPickup = Each TPickup : HUD_ResumeEffects Pickup\ObjectID : Next
End Function


; ------------------------------------------------------------------------
; FUNCTION: ACTIVATE PLAYER SHIELD
; ------------------------------------------------------------------------
Function ActivateShield()
	time_shield = now
	StopChannel Chn_Shield
	Chn_Shield  = PlaySound(Snd_Shield)
	HUD_SetObjectVisibility Shield, True
	HUD_FX_SmoothBlink 	Shield,.7,.2,150, shield_duration
End Function


; ------------------------------------------------------------------------
; FUNCTION: DEACTIVATE PLAYER SHIELD
; ------------------------------------------------------------------------
Function DeactivateShield()
	time_shield = 0
	PlaySound   Snd_Shield_Off
	StopChannel Chn_Shield
	HUD_SetObjectVisibility Shield, False
End Function


; ------------------------------------------------------------------------
; FUNCTION: ACTIVATE IRON MACE WEAPON
; ------------------------------------------------------------------------
Function ActivateMace()
	time_mace = now
	StopChannel Chn_Mace
	Chn_Mace  = PlaySound(Snd_Mace)
	HUD_SetObjectVisibility MaceLine, True
	HUD_SetObjectVisibility Mace,     True
	HUD_FX_Orbit Mace, Ship, 90, 1.0, 0, mace_duration
End Function


; ------------------------------------------------------------------------
; FUNCTION: DEACTIVATE MACE
; ------------------------------------------------------------------------
Function DeactivateMace()
	time_mace = 0
	StopChannel Chn_Mace
	PlaySound   Snd_Shield_Off
	HUD_ClearEffects Mace
	HUD_SetObjectVisibility Mace,     False
	HUD_SetObjectVisibility MaceLine, False
End Function


; ------------------------------------------------------------------------
; FUNCTION: ACTIVATE LASER WEAPON
; ------------------------------------------------------------------------
Function ActivateLaser()
	time_laser = now
	StopChannel Chn_Laser
	Chn_Laser  = PlaySound(Snd_Laser)
	HUD_SetObjectVisibility Laser, True
	HUD_FX_SmoothBlink      Laser, 0.0, 1.0, 50
	HUD_FX_SteadyScale      LaserFlare, 1,1, .2,.2, 50
End Function


; ------------------------------------------------------------------------
; FUNCTION: DEACTIVATE LASER
; ------------------------------------------------------------------------
Function DeactivateLaser()
	time_laser = 0
	StopChannel Chn_Laser
	PlaySound   Snd_Shield_Off
	HUD_ClearEffects Laser
	HUD_ClearEffects LaserFlare
	HUD_SetObjectVisibility Laser, False
	HUD_SetObjectVisibility LaserFlare, False
End Function


; ------------------------------------------------------------------------
; FUNCTION: ACTIVATE HYPER CANNON
; ------------------------------------------------------------------------
Function ActivateHyperCannon()

	PlaySound Snd_Cannon_On
	turboFire = turboFireMax
	HUD_SetObjectVisibility Bar_Cannon, True
	HUD_UpdateShape(Bar_Cannon, "PERCENTBAR", 100,1, 0,0, ship_radius*2,7)

End Function


; ------------------------------------------------------------------------
; FUNCTION: UPDATE / DEACTIVATE ACTIVE WEAPONS
; ------------------------------------------------------------------------
Function UpdateActiveWeapons()

	Local x%, y%

	; FREEZE ACTIVE?
	If time_freeze > 0 And now - time_freeze >= freeze_duration Then UnFreeze()

	; SHIELD ACTIVE?
	If time_shield > 0
		HUD_PositionObject Shield, ship_x, ship_y
		If now - time_shield > shield_duration Then DeactivateShield()
	End If

	; MACE WEAPON ACTIVE?
	If time_mace > 0
		x = HUD_GetObjectX(Mace)
		y = HUD_GetObjectY(Mace)

		If HUD_GetDistance(ship_x,ship_y, x,y) > 100 Then
			HUD_SetObjectVisibility MaceLine, False
		Else
			HUD_UpdateShape MaceLine, "LINE" , 2,0, ship_x,ship_y, x,y
			HUD_SetObjectVisibility MaceLine, True
		End If
		If now - time_mace > mace_duration Then DeactivateMace()
	End If

	; LASER ACTIVE?
	If time_laser > 0
		HUD_PositionObject    Laser, ship_x, ship_y
		HUD_SetObjectRotation Laser, ship_angle
		HUD_MoveObject        Laser, 0, -ship_radius/2, True
		If now - time_laser > laser_duration Then DeactivateLaser()
	End If

End Function


; ------------------------------------------------------------------------
; FUNCTION: SCREEN BOMB
; ------------------------------------------------------------------------
Function FireBomb()

	bombs = bombs - 1 
	UpdateDisplay()
	PlaySound Snd_Shot2
	Local i% : For i = 0 To 360  Step 15 : CreateShot (i, 1, True) : Next

	; SCREEN FLASH
	HUD_SetObjectAlpha Fader,1
	HUD_FX_AlphaFade   Fader,0,500

End Function


; ------------------------------------------------------------------------
; FUNCTION: ACCELERATE SHIP
; ------------------------------------------------------------------------
Function Thrust( upkey% )

	Local f# = fuel

	fuel = fuel - (.1 * delta) : UpdateDisplay()

	; SHOW FUEL WARNING?
	If f > 25 And fuel < 25 Then 
		Local Txt% = HUD_CreateText(Lyr_Text2, 0,0, "+ FUEL WARNING +", "CENTER",0, "CENTER","CENTER")
		HUD_FX_Blink Txt,250,250
		HUD_FX_AutoRemove Txt,3000
		PlaySound Snd_Warning
	End If

	If ChannelPlaying(Chn_Thrust) = False Then Chn_Thrust = PlaySound (Snd_Thrust)
	HUD_SetObjectVisibility Burst, True
	HUD_PositionObject      Burst, HUD_GetObjectX(Ship), HUD_GetObjectY(Ship)
	HUD_SetObjectRotation   Burst, ship_angle
	
	If upkey Then
		ship_velx = ship_velx + Cos(-90 + ship_angle) * (ship_accel * delta)
		ship_vely = ship_vely + Sin(-90 + ship_angle) * (ship_accel * delta)
		; SHIP BURST
		HUD_MoveObject Burst, 0,40,True
		HUD_FlipImage  Burst, False
	Else
		ship_velx = ship_velx - Cos(-90 + ship_angle) * (ship_accel * delta)
		ship_vely = ship_vely - Sin(-90 + ship_angle) * (ship_accel * delta)
		; SHIP BURST
		HUD_MoveObject Burst, 0,-40,True
		HUD_FlipImage  Burst, True
	End If
	
	HUD_FX_SteadyMove Ship, ship_velx, ship_vely, False

End Function


; ------------------------------------------------------------------------
; FUNCTION: CHECK COLLISIONS
; ------------------------------------------------------------------------
Function CheckCollisions()

	Local cx%, cy%, sx%
	Local Shot.TShot
	Local Comet.TComet
	Local Comet2.TComet
	Local Missile.TMissile

	; FOR COMET - LASER CHECK
	Local ClosestComet.TComet, closestDistance% = 10000
	Local d%, a#, line_ex%, line_ey%
	If time_laser > 0 Then
		      a = ship_angle-90 : If a < 0 Then a = a + 360
		line_ex = ship_x + SC_Cos(a)*1500
		line_ey = ship_y + SC_Sin(a)*1500
		HUD_SetObjectSize       Laser, HUD_GetObjectWidth(Laser), 1500
		HUD_SetObjectVisibility LaserFlare, False
	End If
	
	
	; LOOP THROUGH COMETS
	For Comet.TComet = Each TComet
	
		cx% = HUD_GetObjectX(Comet\ObjectID)
		cy% = HUD_GetObjectY(Comet\ObjectID)

		; COMET - PLAYER -----------------------------------------
		If game_over = 0 And HUD_CountEffects (Ship, "Blink") = 0
			If HUD_GetObjectDistance (Comet\ObjectID, Ship) < Comet\radius + ship_radius Then
				PlayerHit(10) : CometHit ( Handle(Comet) )
				Return
			End If
		End If
		
		; COMET - MACE -------------------------------------------
		If time_mace > 0
			If HUD_GetObjectDistance (Comet\ObjectID, Mace) < Comet\radius + mace_radius Then
				StopChannel Chn_MaceHit
				Chn_MaceHit = PlaySound (Snd_MaceHit)
				CometHit ( Handle(Comet), 1 )
				Return
			End If
		End If
		
		; COMET - LASER ------------------------------------------
		If time_laser > 0
			If HUD_GetPointLineDistance (cx,cy, ship_x,ship_y,line_ex,line_ey) < Comet\radius Then
				; GET THE NEAREST COMET ONLY
				d = HUD_GetDistance (cx,cy, ship_x,ship_y)
				If d <= closestDistance Then
					closestDistance = d
					ClosestComet    = Comet
				End If
			End If
		End If

		; COMET - SHOTS ------------------------------------------
		For Shot.TShot = Each TShot
			sx% = HUD_GetObjectX(Shot\ObjectID)
			sy% = HUD_GetObjectY(Shot\ObjectID)
			If sx > cx - 50 And sx < cx + 50 
				If HUD_GetObjectDistance (Comet\ObjectID, Shot\ObjectID) < Comet\radius + 4 Then ; 4 = SHOT WIDTH / 2 (THE RADIUS)
					; COMET HIT
					CreateExplosion (sx, sy, .51)
					CometHit ( Handle(Comet), Shot\powershot)
					; REMOVE SHOT (IF NOT POWER-SHOT)
					If Shot\powershot < 1 Then HUD_RemoveObject Shot\ObjectID : Delete Shot
					Return
				End If
			End If
		Next

		; COMET - MISSILES ---------------------------------------
		For Missile.TMissile = Each TMissile
			sx% = HUD_GetObjectX(Missile\ObjectID)
			sy% = HUD_GetObjectY(Missile\ObjectID)
			If sx > cx - 50 And sx < cx + 50 
				If HUD_GetObjectDistance (Comet\ObjectID, Missile\ObjectID) < Comet\radius + Missile\radius Then
					; RESET TARGET COMET, IF ANY
					Comet2 = Object.TComet (Missile\CometID)
					If Comet2 <> Null Then Comet2\aimed = 0
					; REMOVE MISSILE
					HUD_RemoveObject Missile\ObjectID
					Delete Missile
					; COMET HIT
					CreateExplosion (sx, sy, .51)
					CometHit ( Handle(Comet), 2 )
					Return
				End If
			End If
		Next
	Next

	; COMET HIT BY LASER?
	If ClosestComet <> Null Then
		; SET LASER SIZE
		HUD_SetObjectSize Laser, HUD_GetObjectWidth(Laser), closestDistance - ClosestComet\radius - ship_radius/2
		; SOME PARTICLES
		cx% = ship_x + SC_Cos(a) * (closestDistance - ClosestComet\radius)
		cy% = ship_y + SC_Sin(a) * (closestDistance - ClosestComet\radius)
		CreateParticles (cx, cy, 4)
		; SHOW FLARE
		HUD_PositionObject      LaserFlare, cx, cy
		HUD_SetObjectVisibility LaserFlare, True
		; DAMAGE INVERALL?
		If now - laser_last > 50 Then
			laser_last = now : CometHit (Handle(ClosestComet), 3 )
		End If

	End If

End Function


; ------------------------------------------------------------------------
; FUNCTION: GAME OVER
; ------------------------------------------------------------------------
Function GameOverStuff%()

	If game_over = 0 Then Return
	
	; START GAME OVER SEQUENCE
	If game_over = 1 Then
		game_over = now
		StopChannel Chn_Enemy
		StopChannel Chn_Thrust
		StopChannel Chn_GameMusic
		PlaySound  (Snd_GameOver)
		DeactivateShield()
		DeactivateMace  ()
		HUD_SetObjectVisibility Burst,      False
		HUD_SetObjectVisibility Bar_Cannon, False
		
		HUD_ClearEffects Ship
		HUD_FX_AlphaFade Ship,0,2000
		HUD_FX_ColorFade Ship,0,0,0,2000
		
		; GAME OVER IMAGE
		Local Img%        = HUD_CreateImage (Lyr_Top, 0,0, 0,819, 512,120, "CENTER","CENTER")
		HUD_SetObjectColor  Img,225,225,255,0
		HUD_SetObjectShadow Img, True, 6
		HUD_SetObjectScale  Img,7,7
		HUD_FX_Scale        Img,1,1,3000, 14
		HUD_FX_AlphaFade    Img,1,3000
		HUD_FX_AlphaFade    Img,0,3000,7000

		; FADE SCREEN
		HUD_SetObjectAlpha Fader,0
		HUD_FX_AlphaFade   Fader,1,3000,7000

	; WHILE GAME OVER...
	Else If now-game_over < 10000
		; CREATE EXPLOSIONS
		If Rand(0,10) = 1
			x = HUD_GetObjectX(Ship) + Rand(-45,45)
			y = HUD_GetObjectY(Ship) + Rand(-45,45)
			CreateExplosion (x,y, Rnd (.5,2.5) )
		End If
	
	; FINAL QUIT & TIDY UP
	Else
		Delete Each TShot   
		Delete Each TComet  
		Delete Each TMissile
		Delete Each TPickup 
		HUD_RemoveLayers
		Return True
	End If

	Return False	
		
End Function


; ------------------------------------------------------------------------
; FUNCTION: CALCULATE DELTA-TIME
; ------------------------------------------------------------------------
Function GetDeltaTime()

	Local delta_last# = delta
	Local delta_step# = 0.004
	now   = MilliSecs()
	delta = (now - prev) / (1000.0 / FPS)
	;If delta <= 0 Then delta = 0.001 Else If delta > 5.0 Then delta = 5.0
	If delta >  delta_last + delta_step Then
		delta = delta_last + delta_step
	Else If delta < delta_last - delta_step Then
		delta = delta_last - delta_step
	End If
	prev = now

End Function



Looks like a lot of work you want us to do for you. I can explain you delta, but I won't do manual work for you, no offense. And it's also a fact that delta has been explained several times already, right here. Check out "Search".

I see what you are saying and have read several topics on here without any success. Please don`t get me wrong, I didn`t want anyone to do my work for me I really just wanted someone to explain what the last function was doing with regards to the delta_last part.

If anyone could simply comment the last function for me it would be a great help.

I just included the rest of the code for a better general idea of what the program is doing elsewhere.

Please don`t think that I am lazy just because I need a little advice. I have tried to figure things out on my own but have failed.

Jason.

Hi Jason,
I would suggest you to ask Mike Dogan - the creator of SpriteCandy - he usually answers quite fast.

Sergio.

Thanks, will do.

Jason.

I asked Mike and he was very helpful. I wouldn`t hesitate to recommend his excellent products to anyone as he has great after sales support too.

Jason.