Code archives/Algorithms/Radar Scan: Is that enemy within range?

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

Download source code

Radar Scan: Is that enemy within range? by Ghoula2002
Will scan a given radius and return true/false if target is in range.
;---------------------------------------------------------------
;------------------Radar Check 1.0------------------------------
;---------------------by  Ghoula--------------------------------

;This example will show you how to check if an enemy unit 
;is within a freindly unit's attack radius. This example 
;is a visual representation of the logic involved, so about 95%
;of this code is for pulling off the visuals. Function: 'RealCheckRange'
;at the bottom of this code shows only the hardcore logic needed.
;It's actually quite small :)


;I use this function in my current project for satellites and
;performing air unit strikes (if enemy is in range) and also
;for rocket launcher units (again: if enemy is in range he can be shot)
;I also searched high and low for a routine or snipet of code
;that could do this and found nothing. So with a little patience i made
;my own Function. Maybe someone has a use for this if so feel free To
;use Or abuse code in anyway! :)

Graphics 640,480

Global unit_x,unit_y		;Storage - Freindly unit X and Y map location
Global target_x,target_y	;Storage - Enemy unit X and Y map location
Global range				;Storage - Scan range of unit

;Setup a small 2d map for visuals
Type tiledata
	Field x_loc
	Field y_loc
End Type
SeedRnd MilliSecs()			;Always seed the timer for randomness
SetBuffer FrontBuffer()		;We will draw straight to the frontbuffer nothing fancy

;Set friendly unit location and his radar range
unit_x=10
unit_Y=7
range=6 ;This value is from unit outward. Since we scan a radius the actual scan area is x2 or 12 if value is 6

;Main loop for visuals, will keep scanning until ESC is hit
Repeat

	;Draw map tiles
	DrawTiles()
	;Check our radar to see if enemy is within range. Will return true or false
	InRange=Func_CheckRange(unit_x,unit_y,target_x,target_y,range)

	;Check range returned true so enemy is within range
	If InRange=True
		Color 0,255,0
		Text 0,0,"Target is in range!! hooah!"
	;Returned false, enemy not in range
	Else
		Color 255,0,0
		Text 0,0,"Target not in range"
	EndIf
	Delay 1000 ;Delay fer visuals
	
Until KeyHit(1)
End

;----Func: Check range---------------------------------------------------
Function Func_CheckRange(ux,uy,tx,ty,rng)

	;For illustration purposes this function has been tailored to simulate
	;32x32 pixel sized tiles but is easily adjustable to work on different
	;size tiles. Also keep in mind mmost of this crap is for the visuals :)
	
	;Draw radius circle
	Color 255,0,0
	Oval ((ux*32)-rng*32)+16,((uy*32)-rng*32)+16,rng*64,rng*64,0
	
	;Scan logic, notice that only a 90 degree sweep is needed to effectively
	;scan a 360 degree radius. The visuals will show you the logic in action
	
	For degrees=0 To 90 Step 5 ;The smaller the scan area the higher the step can be
							   ;if you are scanning large areas then lower the step value
							   ;to aviod 'gaps'. Observe the blue line when program is running.
							   ;In this example 5 is actually overkill could get away with
							   ;a higher value since our scan radius is small.
							
		Delay 100 ;A delay simply for visuals, remove delay and it's lightning quick
		scanx=ux*32+16+Sin(degrees)*rng*32 ;<< The SIN logic
		scany=uy*32+16+Cos(degrees)*rng*32 ;<< The COS logic
		Color 0,50,255
		Line scanx,scany,ux*32+16,uy*32+16 ;Blue degree line (visual)
		scanx=Abs(scanx-ux*32) ;<< Some gnomish magic (using ABS to keep the number posistive)
		scany=Abs(scany-uy*32) ;<< "
		
		;Here we will color the tiles we have scanned yellow
		For tile.tiledata=Each tiledata
			If tile\x_loc>(ux*32)-scanx And tile\x_loc<(ux*32)+scanx And tile\y_loc>(uy*32)-scany And tile\y_loc<(uy*32)+scany
				Color 220,220,0
				Rect tile\x_loc,tile\y_loc,32,32,0
				;Target in range return true
				If tile\x_loc=tx*32 And tile\y_loc=ty*32 Then Return True
			EndIf
		Next
	Next
	
	;Target not in range, return false
	Return False

End Function

;----Draw tiles (illustration purposes)-----------------------------------
Function DrawTiles()

	;Draw map grid
	Cls
	x=0
	y=0
	Color 111,111,111
	For t=1 To 300
		Rect x,y,32,32,0
		x=x+32
		tile.tiledata=New tiledata
		tile\x_loc=x
		tile\y_loc=y
		If x=>640
			x=0
			y=y+32
		EndIf
	Next
	;Draw unit
	Color 0,220,0
	Rect unit_x*32,unit_y*32,32,32,1
	;Draw target unit at random location
	target_x=Rand(19) ;Remember Rand for integers and Rnd fer floating numbers! :)
	target_y=Rand(14) ; 						""
	Color 255,0,0
	Rect target_x*32,target_y*32,32,32,1

End Function




;---------------------------------------------------------------------------
;----Here is the radar check function stripped down and ready fer action----
;----If your are using diffrent size tiles say 48x48 then change all 32s----
;----to 48 and all 16s to 24. You get the picture :P
;---------------------------------------------------------------------------

;----Func: Check range------------------------------------------------------
Function Func_RealCheckRange(ux,uy,tx,ty,rng)

	For degrees=0 To 90 Step 5
		scanx=ux*32+16+Sin(degrees)*rng*32
		scany=uy*32+16+Cos(degrees)*rng*32
		scanx=Abs(scanx-ux*32)
		scany=Abs(scany-uy*32)
		;Scan tiles		
		For tile.tiledata=Each tiledata
			If tile\x_loc>(ux*32)-scanx And tile\x_loc<(ux*32)+scanx And tile\y_loc>(uy*32)-scany And tile\y_loc<(uy*32)+scany
				;In range
				If tile\x_loc=tx*32 And tile\y_loc=ty*32 Then Return True
			EndIf
		Next
	Next
	;Not in range
	Return False

End Function

Comments

None.

Code Archives Forum