Code archives/Miscellaneous/Topdown Space shooter Example

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

Download source code

Topdown Space shooter Example by Pakz2014


Here a video of it in action : http://youtu.be/b3yp99XM1to

I made a very simple space shooter example. The ship is a square that rotates into the direction he is traveling in. You can shoot. The enemy turrets can shoot. The enemy ships can Shoot.
You have a hull strength of 10. If that is 0 then the game restarts. If you destroy the ships and the turrets then the game restarts to.

I hope someone finds it useable.
; Topdown Space Shooter Example by Pakz (Rudy van Etten)

; The map is drawn on a image.
; Every object needs to be moved with the player movement speed, this is done
; in the updatemap function.

Graphics 640,480,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Const mapwidth = 39
Const mapheight = 29
Dim map(mapwidth,mapheight)
Global mapimage = CreateImage(mapwidth*32+32,mapheight*32+32)
Global mapx# = 0
Global mapy# = 0

Global myfont = LoadFont("verdana.ttf",16)
SetFont myfont

; tx = the destination of the ship
Type ship
	Field x#,y#,mx#,my#,angle,tx,ty,shootdelaytime
	Field hull
End Type

Type sbullet ; ship bullets
	Field x#,y#,mx#,my#,dtraveled
End Type


Type turret ; the turrets
	Field x#,y#,angle,shootdelaytime,hull
End Type

Type tbullet ; turret bullets
	Field x#,y#,mx#,my#
	Field dtraveled ; Distance traveled by the bullet
End Type

Type player
	Field x#,y#,mx#,my#,angle,thrust#
	Field image[360],shootdelaytime
	Field score,hull
End Type

Type pbullet
	Field x#,y#,mx#,my#
	Field dtraveled
End Type

Global p.player = New player
p\x = GraphicsWidth()/2-16
p\y = GraphicsHeight()/2-16

initplayer()

restart()

timer = CreateTimer(60)
While KeyDown(1) = False
	WaitTimer timer
	Cls
	updateplayer()
	updateturrets()
	updateships()
	updatemap()
	updatepbullets()
	updatetbullets()
	updatesbullets()
	pbulletturretcollision()
	pbulletshipcollision()	
	tbulletplayercollision()
	sbulletplayercollision()
	drawmap()
	drawturrets()
	drawships()
	drawplayer()
	drawpbullets()
	drawtbullets()
	drawsbullets()
	Color 255,255,255
	Text GraphicsWidth()-100,5,"Hull:"+p\hull,1,1
	Text GraphicsWidth()-100,15,"Turrets left:"+turretsleft(),1,1
	Text GraphicsWidth()-100,25,"Ships left:"+shipsleft(),1,1
	If turretsleft() = 0 And shipsleft() = 0 Then restart()
	Flip
Wend
End

Function sbulletplayercollision()
	For this.sbullet = Each sbullet
		If RectsOverlap(this\x-3,this\y-3,6,6,p\x-16,p\y-16,32,32) Then 
			p\hull = p\hull - 1
			If p\hull = 0
				restart
				Return
			End If
			Delete this
		End If
	Next
End Function

Function updatesbullets()
	For this.sbullet = Each sbullet
		this\x = this\x + this\mx
		this\y = this\y + this\my
		this\dtraveled = this\dtraveled + 1
		If this\dtraveled > 640 Then Delete this
	Next
End Function

Function drawsbullets()
	For this.sbullet = Each sbullet
		Color 255,0,0
		Oval this\x-3,this\y-3,6,6,True
	Next
End Function

Function pbulletshipcollision()
	For this.ship = Each ship
	For that.pbullet = Each pbullet
		If RectsOverlap(this\x-16,this\y-16,32,32,that\x-3,that\y-3,6,6)
			Delete that
			this\hull = this\hull - 1
		End If
	Next
		If this\hull <= 0 Then Delete this
	Next
End Function

Function updateships()
	For this.ship = Each ship
		da = getangle(this\tx,this\ty,this\x,this\y)
		v1 = 0 ; left side 
		v2 = 0 ; right side
		ta = this\angle ; get the current angle into ta
		; Count to the left to get the steps to the target angle
		exitloop = False
		While exitloop = False
			ta = ta - 1
			v1 = v1 + 1				
			If RectsOverlap(ta,ta,4,4,da,da,4,4) Exitloop = True
			If ta < -180 Then ta = 181
		Wend
		ta = this\angle ;'get the current angle into ta
		; Count to the right to get the steps top the target angle
		exitloop = False
		While exitloop = False
			ta = ta + 1
			v2 = v2 + 1
			If RectsOverlap(ta,ta,4,4,da,da,4,4) exitloop = True
			If ta >= 180 Then ta = -181
		Wend
		;
		If v1 > v2 ; if the left side is closer to the target angle
			this\angle = this\angle - 3
		Else	; if the right side is closer to the target angle
			this\angle = this\angle + 3
		End If
		; move the missile
		this\x = this\x + Cos(this\angle) * 1
		this\y = this\y + Sin(this\angle) * 1
		
		If distance(this\x,this\y,p\x,p\y) < 96 Or Rand(0,200) = 1
			exitloop = False
			While exitloop = False
				x1 = Rand(-(GraphicsWidth()*2),GraphicsWidth()*2)
				y1 = Rand(-(GraphicsHeight()*2),GraphicsHeight()*2)
				If distance(p\x,p\y,x1,y1) > 320
					this\tx = x1
					this\ty = y1
					exitloop = True
				End If
			Wend
		End If		 
		If distance(this\x,this\y,p\x,p\y) > 300
			this\tx = p\x
			this\ty = p\y
		End If
		; Shoot at the player if he is nearby
		If distance(this\x,this\y,p\x,p\y) < 150
		If this\shootdelaytime < MilliSecs()
			this\shootdelaytime = MilliSecs() + 1000
			sb.sbullet = New sbullet
			ta = getangle(this\x,this\y,p\x,p\y)
			sb\x = this\x-16 + Cos(ta)*16
			sb\y = this\y-16 + Sin(ta)*16
			sb\mx = Cos(ta)*2
			sb\my = Sin(ta)*2
		End If
		End If
	Next
	
End Function

Function initships()
	For i=0 To 3
		this.ship = New ship
		this\x = Rand(-(GraphicsWidth()*2),GraphicsWidth()*2)
		this\y = Rand(-(GraphicsHeight()*2),GraphicsHeight()*2)
		this\tx = p\x+Rand(-64,64)
		this\ty = p\y+Rand(-64,64)
		this\angle = 0
		this\hull = 3
	Next
End Function

Function drawships()
	For this.ship = Each ship
		DrawImage p\image[0],this\x-16,this\y-16
	Next
End Function


Function shipsleft()
	For this.ship = Each ship
		cnt = cnt + 1
	Next
	Return cnt
End Function

Function turretsleft()
	For this.turret = Each turret
		cnt = cnt + 1
	Next
	Return cnt
End Function

Function tbulletplayercollision()
	For this.tbullet = Each tbullet
		If RectsOverlap(this\x-3,this\y-3,6,6,p\x-16,p\y-16,32,32)
			Delete this
			p\hull = p\hull - 1
			If p\hull < 1
				restart
				Return
			End If
		End If
	Next
End Function


Function restart()
	Delete Each pbullet
	Delete Each tbullet
	Delete Each sbullet
	Delete Each turret
	Delete Each ship
	p\hull = 10
	p\thrust = .1
	mapx = 0
	mapy = 0
	Cls
	Text GraphicsWidth()/2,GraphicsHeight()/2,"Get Ready",1,1
	Flip
	Delay 1000
	initmap()
	initships()
End Function

Function pbulletturretcollision()
	For this.turret = Each turret
	For that.pbullet = Each pbullet		
		If RectsOverlap(this\x+4,this\y+4,32-8,32-8,that\x-3,that\y-3,6,6) Then
			Delete that
			this\hull = this\hull - 1
		End If
	Next
	If this\hull < 0 Then Delete this
	Next
End Function

Function updateplayer()
	Local my# = 0
	Local mx# = 0
	If KeyDown(203)
		p\angle = p\angle - 1
		If p\angle < 0 Then p\angle = 360
	End If
	If KeyDown(205)
		p\angle = p\angle + 1
		If p\angle >= 360 Then p\angle = 0
	End If
	If KeyDown(200)
		mx = Cos(p\angle) * p\thrust
		my = Sin(p\angle) * p\thrust
		If mx < 0  
			If p\mx > -1 Then p\mx = p\mx + mx
		End If
		If mx > 0
			If p\mx < 1 Then p\mx = p\mx + mx
		End If
		If my < 0
			If p\my > -1 Then p\my = p\my + my
		End If
		If my > 0
			If p\my < 1 Then p\my = p\my + my
		End If
	End If 
	If KeyDown(57) And p\shootdelaytime < MilliSecs()
		pb.pbullet = New pbullet
		pb\x = GraphicsWidth()/2-16 + Cos(p\angle-180) * 16
		pb\y = GraphicsHeight()/2-16 + Sin(p\angle-180) * 16
		pb\mx = Cos(p\angle-180) * 4.5
		pb\my = Sin(p\angle-180) * 4.5
		p\shootdelaytime = MilliSecs() + 200
	End If
End Function

Function updateturrets()
	For this.turret = Each turret
		If distance(this\x,this\y,p\x,p\y) < 220 Then
		If this\shootdelaytime < MilliSecs()
			a = getangle(this\x,this\y,p\x,p\y)
			that.tbullet = New tbullet
			that\x = this\x + 16 + Cos(a) * 16
			that\y = this\y + 16 + Sin(a) * 16
			that\mx = Cos(a)*2
			that\my = Sin(a)*2
			this\shootdelaytime = MilliSecs()+1000
		End If
		End If
	Next
End Function

Function updatetbullets() ; update turret bullets
	For this.tbullet = Each tbullet
		this\dtraveled = this\dtraveled + 1
		this\x = this\x + this\mx
		this\y = this\y + this\my
		If this\dtraveled > 640 Then Delete this
	Next
End Function


Function drawtbullets() ; draw turret bullet
	For this.tbullet = Each tbullet
		Color 255,255,0
		Oval this\x-3,this\y-3,6,6,True
	Next
End Function

Function drawturrets()
	For this.turret = Each turret
		Color 0,0,255
		Oval this\x,this\y,32,32,True
	Next
End Function

Function updatepbullets()
	For this.pbullet = Each pbullet
		this\dtraveled = this\dtraveled + 1
		this\x = this\x + this\mx
		this\y = this\y + this\my
		If this\dtraveled > 640 Then Delete this
	Next
End Function

; draw player bullets
Function drawpbullets()	
	For this.pbullet = Each pbullet
		Color 200,0,0
		Oval this\x,this\y,6,6,True
		Color 255,255,255
		Oval this\x,this\y,6,6,False	
	Next
End Function

Function updatemap()
		mapx = mapx + p\mx
		mapy = mapy + p\my
		; Move every player bullet with the movement speed of the player
		For pb.pbullet = Each pbullet
			pb\x = pb\x + p\mx
			pb\y = pb\y + p\my
		Next
		; Move every turret 
		For t.turret = Each turret
			t\x = t\x + p\mx
			t\y = t\y + p\my
		Next
		; Move every turret bullet
		For tb.tbullet = Each tbullet
			tb\x = tb\x + p\mx
			tb\y = tb\y + p\my
		Next
		; Move every ship
		For s.ship = Each ship
			s\x = s\x + p\mx
			s\y = s\y + p\my
		Next
End Function

Function drawmap()
	DrawImage mapimage,mapx,mapy
End Function

Function initplayer()
	Local image = CreateImage(32,32)
	MidHandle image
	SetBuffer ImageBuffer(image)
	Color 255,255,255
	Rect 0,0,32,32,True
	Color 55,55,55
	Oval 0,16-3,6,6,True
	For i=0 To 360
		p\image[i] = CreateImage(32,32)
		p\image[i] = CopyImage(image)
		RotateImage p\image[i],i
	Next
	SetBuffer BackBuffer()
End Function

Function drawplayer()
	DrawImage p\image[p\angle],p\x,p\y
End Function

Function initmap()
	Restore mymap
	For y=0 To mapheight
	For x=0 To mapwidth
		Read a
		If a = 1 Then map(x,y) = a
		If a = 2 
			t.turret = New turret
			t\x = x * 32
			t\y = y * 32
			t\hull = 3
		End If
	Next
	Next
	SetBuffer ImageBuffer(mapimage)
	For y=0 To mapheight
	For x=0 To mapwidth
		Select map(x,y)
			Case 0:Color 0,0,0
			Case 1:Color 55,55,155
		End Select
		Rect x*32,y*32,32,32,True
	Next
	Next
	SetBuffer BackBuffer()
End Function

.mymap
Data 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1
Data 1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,1
Data 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1
Data 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0
Data 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0
Data 0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,0,0,0
Data 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0
Data 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,2,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,1,1,1,2,1,1,1,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,0,1,2,1,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
Data 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0
Data 0,0,0,0,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,0,0,0
Data 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0
Data 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0
Data 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1
Data 1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,1
Data 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1

Function distance(x1,y1,x2,y2)
	Return Abs(x2-x1)+Abs(y2-y1)
End Function

Function getangle(x1,y1,x2,y2)
         Local dx = x2 - x1
         Local dy = y2 - y1
         Return ATan2(dy,dx)+360 Mod 360
End Function

Comments

None.

Code Archives Forum