Code archives/3D Graphics - Misc/Radar

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

Download source code

Radar by kevin80842006
This program shows a fairly simple way to implement a radar in your game. Hope it helps someone.
; **************************************************************************************************
; A simple radar system by Kevin Lee Legge (kevin8084@gmail.com)
; **************************************************************************************************


; set up the 3d graphics
Graphics3D 800,600,32,1
SetBuffer BackBuffer()

SeedRnd MilliSecs()

Const enemy_type  = 2
Const cube_type   = 3

Const radarX=660 ; x-coordinate of the radar on the screen
Const radarY=10  ; y-coordinate of the radar on the screen
Const centerX=radarX+65 ; center (x-coordinate) of the radar
Const centerY=radarY+65 ; center (y-coordinate) of the radar

Global sweep=0 ; this is used for the radar's sweep

Type enemy
	Field entity
	Field x#,y#,z#
End Type

; create an enemy to track
Global e.enemy = New enemy
e\entity=CreateSphere()
EntityRadius e\entity,1
EntityColor e\entity,255,0,0
EntityShininess e\entity,1
PositionEntity e\entity,Rand(-10,10),0,Rand(-15,15)
EntityType e\entity,enemy_type

; we need to see things and be able to move around
Global player=CreateCamera()
PositionEntity player,0,0,0

light=CreateLight()
PositionEntity light,25,100,25
RotateEntity light,90,0,0

plane=CreatePlane()
EntityColor plane,0,50,0
PositionEntity plane,0,-1,0

; let's populate the world with some cubes for visual reference
For c=1 To 30
	cube = CreateCube()
	EntityType cube,cube_type
	EntityColor cube,Rand(255),Rand(255),Rand(255)
	PositionEntity cube,Rand(-125,125),0,Rand(-125,125)
Next

; don't want the enemy to pass through the cubes
Collisions enemy_type,cube_type,2,2

While Not KeyHit(1)
If KeyDown(200) Then MoveEntity player,0,0,.2
If KeyDown(208) Then MoveEntity player,0,0,-.2
If KeyDown(203) Then TurnEntity player,0,1,0
If KeyDown(205) Then TurnEntity player,0,-1,0

; give the enemy some movement to track on the radar
moveEnemy(e)

UpdateWorld
RenderWorld
; draw the radar
drawRadar()
; plot the enemy on the radar in relation to the player
radar(e,player)
Flip
Delay 10
Wend
; free up some memory
FreeEntity e\entity
Delete e
End

Function moveEnemy(enemy.enemy)
; this function just allows the enemy to move at random so that we can track its progress
; on the radar
MoveEntity enemy\entity,0,0,.1
If Rand(55)=12 Then RotateEntity enemy\entity,0,EntityYaw#(enemy\entity)+Rand(-15,15),0
End Function

Function drawRadar()
; this function just draws your basic radar screen
Color 85,255,85 ; a fairly light green color
Oval radarX,radarY,130,130,0 ; first circle of the radar - 130 pixels in diameter
Oval radarX+20,radarY+20,90,90,0 ; second circle - 90 pixels in diameter
Oval radarX+40,radarY+40,50,50,0 ; third circle - 50 pixels in diameter
Color 120,195,120
; separate the upper and lower half of the radar into quadrants
Line centerX,radarY+40,centerX,10
Line centerX,radarY+90,centerX,radarY+130
Line centerX+25,centerY,centerX+65,centerY
Line centerX-65,centerY,centerX-25,centerY
Line centerX+18,centerY-18,centerX+Cos(45)*65,centerY-Sin(45)*65
Line centerX-18,centerY-18,centerX-Cos(45)*65,centerY-Sin(45)*65
Line centerX+18,centerY+18,centerX+Cos(45)*65,centerY+Sin(45)*65
Line centerX-18,centerY+18,centerX-Cos(45)*65,centerY+Sin(45)*65

; this line command draws the radar's sweep. The Cos and Sin enable the sweep to traverse a
; 360 degree arc from the centerpoint
Line centerX,centerY,centerX+Cos(sweep)*65,centerY+Sin(sweep)*65
sweep=sweep+1
; this resets the variable back to 0 if it exceeds 360 degrees
If sweep>360 Then sweep=0
; set color back to white in case you need to draw text, etc...
Color 255,255,255
End Function


Function radar(e.enemy,center)
; this function plots the enemy's location relative to the player
; note: "center" in this function call is the player's location
For e.enemy=Each enemy
	dist#=EntityDistance#(center,e\entity) ; first we need to get the distance of the enemy from the player
	dx#=EntityX(center)-EntityX(e\entity) ; how far to the side of the player is the enemy?
	dz#=EntityZ(center)-EntityZ(e\entity) ; how far in front or behind the player is the enemy?
	; what's the angle to turn to face the enemy - compensating for the player's turning?
	deltay#=ATan2(dx,dz)-180+EntityYaw#(center)
	; just basic trigonometry to find the point x,y (enemy's location) given the angle deltay#
	x#=dist*Cos(deltay#-90)
	y#=dist*Sin(deltay#-90) 
	x#=x#/2 ; scales down the x-coordinate by half so that the plot stays within our radar
	y#=y#/2 ; scales down the y-coordinate by half so that the plot stays within our radar
	Color 255,255,255
	If dist#<=130 Then ; this is the diameter of our largest radar circle
		Plot centerX+x,centerY+y ; plot the pixel representing our enemy
	End If
Next
End Function ; radar()

Comments

Boiled Sweets2006
Very nice!


kevin80842006
thank you


Mike01012006
Cool! Thnx


Jerome Squalor2007
is anything supposed to show up on the radar??


puki2007
Yes - the red sphere.

Plot centerX+x,centerY+y


Code Archives Forum