I wanted to try and create a map generator for games like rpg's and such. I created code here that randomly finds a spot for a new room on the map and puts it there if it its next to another room with enough space to walk through.
Import mojo Class room Field mapwidth:Int=640/12 Field mapheight:Int=480/12 Field tilewidth:Int=12 Field tileheight:Int=12 Field map:Int[640/12][] Field refreshmaptime:Int=0 Method New() For Local i = 0 Until mapwidth map[i] = New Int[mapheight] Next newmap End Method Method update() If KeyHit(KEY_SPACE) Then newmap refreshmaptime=0 End If refreshmaptime+=1 If refreshmaptime>200 Then newmap refreshmaptime=0 End If End Method Method draw() For Local y=0 Until mapheight For Local x=0 Until mapwidth If map[x][y] = 1 SetColor 150,150,150 DrawRect x*tilewidth,y*tileheight, tilewidth,tileheight End If If map[x][y] = 2 SetColor 200,200,200 DrawRect x*tilewidth,y*tileheight, tilewidth,tileheight End If Next Next End Method Method newmap() For Local y=0 Until mapheight For Local x=0 Until mapwidth map[x][y] = 0 Next Next drawrectinmap(Rnd(10,mapwidth-10),Rnd(10,mapheight-10),5,3) For Local i=0 Until 10 makeroom Next makewalls End Method Method makewalls() ' put walls on the map For Local y=1 Until mapheight-1 For Local x=1 Until mapwidth-1 If map[x][y] = 0 If map[x+1][y] = 1 map[x+1][y] = 2 End If End If If map[x][y] = 1 If map[x+1][y] = 0 map[x][y] = 2 End If End If If map[x][y] = 1 If map[x][y+1] = 0 map[x][y] = 2 End If End If If map[x][y] = 0 If map[x][y+1] = 1 map[x][y+1] = 2 End If End If Next Next End Method Method makeroom:Bool() 'find suitable place to make room Local exitloop:Bool=False Local cnt:Int=0 While exitloop = False cnt+=1 If cnt>8000 Then exitloop=True Local x:Int=Rnd(5,mapwidth-8) Local y:Int=Rnd(5,mapheight-8) Local roomw:Int=Rnd(4,8) Local roomh:Int=Rnd(4,8) Local pass1:Bool=True For Local y1=0 Until roomh For Local x1=0 Until roomh If map[x1+x][y1+y] = 1 Then pass1=False Next Next Local pass2:Bool=False If pass1=True Then For Local y1=3 To roomh-3 If map[x-1][y+y1] = 1 Then pass2=True If map[x+roomw][y+y1] = 1 Then pass2=True Next For Local x1=3 To roomw-3 If map[x+x1][y-1] = 1 Then pass2 = True If map[x+x1][y+roomh] = 1 Then pass2 = True Next End If If pass2 = True Then drawrectinmap(x,y,roomw,roomh) Return End If Wend End Method Method issuitable:Bool(x:Int,y:Int,w:Int,h:Int) For Local y1=0 Until h For Local x1=0 Until w If map[x+x1][y+y1] = 1 Then Return False Next Next Return True End Method Method drawrectinmap(x:Int,y:Int,w:Int,h:Int) For Local y1=0 Until h For Local x1=0 Until w map[x+x1][y+y1] = 1 Next Next End Method End Class Global myroom:room = New room() Class MyGame Extends App Method OnCreate() SetUpdateRate(60) End Method Method OnUpdate() myroom.update End Method Method OnRender() Cls(0,0,0) myroom.draw SetColor 255,255,255 DrawText "Press spacebar to create new map ", 2,2 End End Function Main() New MyGame() End
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.