Here a simple land/terrain generator. It works by drawing ovals on top of each other adding the tile value below. I think it creates useable maps. You can set the mapwidth and height and tilewidth and height values.
I will be using this land generator method for my Civilization style game project experiments.
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 numland:Int = 0
Global percland:Float = 1.7
Class MyGame Extends App
Method OnCreate()
SetUpdateRate(1)
Seed = Rnd(1000)
'Set up the map array to be multi dimensional
For Local i=0 Until mapwidth
map[i] = New Int[mapheight]
Next
' make the map the first time
makemap
End Method
Method OnUpdate()
' how much land must it have numoflandtiles </mapsize/percland
percland = Rnd(1.5,2.0)
makemap
End Method
Method OnRender()
Cls 0,0,0
drawmap
SetColor 255,255,255
DrawText "Random Map Generator. Mapwidth: "+mapwidth+", Mapheight: "+mapheight,0,0
End Method
End Class
Function drawmap:Void()
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
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.