Here a example of how to get the 2 nearest tiles to the sea into one array. This area data can be used for the ai (Astar) to do things like patrol near the sea. (strategies)
Code below :
Import mojo
Const mapwidth:Int=640/8
Const mapheight:Int=480/8
Const tilewidth:Int=8
Const tileheight:Int=8
Global map:Int[mapwidth][]
Global seabordermap[mapwidth][]
Global numland:Int = 0
Global percland:Float = 1.7
Global showborder:Bool = False
Global makecnt:Int=0
Class MyGame Extends App
Method OnCreate()
SetUpdateRate(10)
Seed = Rnd(1000)
'Set up the map array to be multi dimensional
For Local i=0 Until mapwidth
map[i] = New Int[mapheight]
seabordermap[i] = New Int[mapheight]
Next
' make the map the first time
makemap
makeseaborders()
End Method
Method OnUpdate()
makecnt+=1
If makecnt > 50 Then
' how much land must it have numoflandtiles </mapsize/percland
percland = Rnd(1.5,2.0)
makemap
makeseaborders
makecnt = 0
End If
If KeyDown(KEY_SPACE) Then showborder = True Else showborder = False
End Method
Method OnRender()
Cls 0,0,0
drawmap(showborder)
SetColor 255,255,255
DrawText "Area near sea highlighted - for patrolling ai.",0,0
DrawText "Press space to highlight sea border area.",0,15
End Method
End Class
Function makeseaborders:Void()
' erase any old data
For Local y=0 Until mapheight
For Local x=0 Until mapwidth
seabordermap[x][y] = 0
Next
Next
' first line near to the sea tiles
For Local y1=0 Until mapheight
For Local x1=0 Until mapwidth
Local cnt:Int=0
If map[x1][y1] >= 5
For Local y2=-1 To 1
For Local x2=-1 To 1
Local x3=x1+x2
Local y3=y1+y2
If x3>=0 And y3>=0 And x3<mapwidth And y3<mapheight
If map[x3][y3] < 5
cnt+=1
End If
End If
Next
Next
If cnt>0 Then
seabordermap[x1][y1] = 1
End If
End If
Next
Next
' make temp array
Local tmap:Int[mapwidth][]
For Local i=0 Until mapwidth
tmap[i] = New Int[mapheight]
Next
' make land tile next to sea border tile a seaborder tile
For Local y1=0 Until mapheight
For Local x1=0 Until mapwidth
If seabordermap[x1][y1] = 1
For Local y2=-1 To 1
For Local x2=-1 To 1
Local x3 = x1+x2
Local y3 = y1+y2
If x3>=0 And y3>=0 And x3<mapwidth And y3<mapheight
If map[x3][y3] >= 5
tmap[x3][y3] = 1
End If
End If
Next
Next
End If
Next
Next
'put the temp array into the seaborderarray
For Local y=0 Until mapheight
For Local x=0 Until mapwidth
If tmap[x][y] > 0 Then seabordermap[x][y] = 1
Next
Next
End Function
Function drawmap:Void(showborder:Bool=True)
For Local y=0 Until mapheight
For Local x=0 Until mapwidth
Local val:Int=map[x][y]
' tile 1,2,3,4 is sea
If val<5 Then SetColor 0,0,val*10+100
' tile 5 6 7 8 is grasslands/trees
If val>=5 And val <9 Then SetColor 0,val*15,0
'tiles 9 10 11 12 13 is mountains
If val>=9 Then SetColor val*15,val*4,0
' draw the tile
DrawRect x*tilewidth,y*tileheight,tilewidth,tileheight
Next
Next
If showborder = True
SetColor 255,255,255
SetAlpha 0.35
For Local y=0 Until mapheight
For Local x=0 Until mapwidth
If seabordermap[x][y] = 1
DrawRect x*tilewidth,y*tileheight,tilewidth,tileheight
End If
Next
Next
SetAlpha 1
End If
End Function
Function makemap:Void()
numland=0
' exit loop if conditions on land percentage is good
While numland<(mapwidth*mapheight/percland)
' erase the old data
For Local y=0 Until mapheight
For Local x=0 Until mapwidth
map[x][y] = 0
Next
Next
'lowest hold the highest tile value
Local lowest = 0
' while land height is below 13
While lowest < 13
Local x1 = Rnd(mapwidth)
Local y1 = Rnd(mapheight)
' create a radius for draw oval
Local radius = Rnd(3,6)
' loop and create oval
For Local y2=-radius To radius
For Local x2=-radius To radius
If ((x2*x2)+(y2*y2)) <= radius*radius+radius*0.8
Local x3 = x1+x2
Local y3 = y1+y2
If x3>=0 And y3>=0 And x3<mapwidth And y3<mapheight
' add current position with added older tile value
map[x3][y3]=map[x3][y3]+1
' if current value is higher then lowest loop value
' then store it in the loop exit variable
If map[x3][y3] > lowest Then lowest = map[x3][y3]
End If
End If
Next
Next
Wend
'Count the number of land tiles
numland=0
For Local y=0 Until mapheight
For Local x=0 Until mapwidth
' if the value is above 4 then add landtile counter
If map[x][y] >= 5 Then numland+=1
Next
Next
Wend
End Function
Function Main()
New MyGame()
End Function
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.