Here a example of a map editor for single screen maps. The theme is topdown.
Code below :
Import mojo
Class mapeditor
Field tilewidth:Int,tileheight:Int
Field mapwidth:Int,mapheight:Int
Field map:Int[][],shoremap:String[][]
Field ctile:Int=1 'current drawing tile
Method New(mapwidth:Int,mapheight:Int,tilewidth:Int,tileheight:Int)
Self.tilewidth = tilewidth
Self.tileheight = tileheight
Self.mapwidth = mapwidth
Self.mapheight = mapheight
map = New Int[mapwidth][]
shoremap = New String[mapwidth][]
For Local i = 0 Until mapwidth
map[i] = New Int[mapheight]
shoremap[i] = New String[mapheight]
Next
End Method
Method update()
Local x1 = MouseX() / tilewidth
Local y1 = MouseY() / tileheight
If MouseDown(MOUSE_LEFT)
setmap(x1,y1,ctile)
makeshoremap
End If
If KeyDown(KEY_0) Then ctile = 0
If KeyDown(KEY_1) Then ctile = 1
If KeyDown(KEY_2) Then ctile = 2
If KeyDown(KEY_3) Then ctile = 3
If KeyDown(KEY_4) Then ctile = 4
End Method
Method setmap:Void(x:Int,y:Int,val:Int)
If x>=0 And y>=0 And x<mapwidth And y<mapheight
map[x][y] = val
End If
End Method
Method drawmap:Void()
For Local y1=0 Until mapheight
For Local x1=0 Until mapwidth
drawtile(map[x1][y1],x1*tilewidth,y1*tileheight)
Next
Next
drawshoremap
SetColor 255,255,255
Local mx:Int=MouseX()/tilewidth
Local my:Int=MouseY()/tileheight
Local x1:Int=mx*tilewidth
Local y1:Int=my*tileheight
drawboxedrect x1,y1,tilewidth,tileheight
If KeyDown(KEY_SPACE)
SetColor 0,0,0
DrawRect 0,0,640,36
Local y1:Int=1
Local x1:Int=1
For Local i:Int=0 To 4
If ctile = i
SetColor 255,255,0
DrawRect x1-1,y1-1,34,34
End If
drawtile(i,x1,y1)
SetColor 255,255,255
Select i
Case 0;DrawText "0",x1,y1
Case 1;DrawText "1",x1,y1
Case 2;DrawText "2",x1,y1
Case 3;DrawText "3",x1,y1
Case 4;DrawText "4",x1,y1
End Select
x1+=34
Next
End If
End Method
Method drawtile(val:Int,x1:Int,y1:Int)
Select val
Case 0'water
SetColor 0,0,255
DrawRect x1,y1,tilewidth,tileheight
Case 1'land
SetColor 0,200,0
DrawRect x1,y1,tilewidth,tileheight
Case 2'forrest
drawtile(1,x1,y1)
SetColor 0,255,0
DrawOval x1+5,y1+5,tilewidth-10,tileheight/2
SetColor 150,10,0
DrawRect x1+12,y1+tileheight-10,tilewidth-24,tileheight/2-5
Case 3'hill
drawtile(1,x1,y1)
SetColor 0,255,0
DrawOval x1+5,y1+10,tilewidth-10,tileheight-15
SetColor 0,200,0
DrawRect x1,y1+tileheight/1.5,tilewidth,10
Case 4'mountain
drawtile(1,x1,y1)
SetColor 200,200,200
DrawPoly( [Float(x1+tilewidth/2),Float(y1),
Float(x1+tilewidth-5),Float(y1+tileheight-5),
Float(x1+5),Float(y1+tileheight-5)])
End Select
End Method
Method drawshoremap:Void()
For Local y=0 Until mapheight
For Local x=0 Until mapwidth
Local s:String=shoremap[x][y]
Local x1:Int=x*tilewidth
Local y1:Int=y*tileheight
' tile 1,2,3,4 is sea
SetColor 0,150,0
If s[0..1] = "1" Then DrawRect x1+(tilewidth/4),y1-2,tilewidth/2,2
If s[1..2] = "1" Then DrawRect x1+tilewidth,y1+tileheight/4,2,tileheight/2
If s[2..3] = "1" Then DrawRect x1+(tilewidth/4),y1+tileheight,tilewidth/2,2
If s[3..4] = "1" Then DrawRect x1-2,y1+tileheight/4,2,tileheight/2
Next
Next
End Method
Method makeshoremap:Void()
For Local y=0 Until mapheight
For Local x=0 Until mapwidth
shoremap[x][y]="0000"
Next
Next
For Local y=0 Until mapheight
For Local x=0 Until mapwidth
If map[x][y] > 0
If y-1>=0
If map[x][y-1] = 0
Local sm:String=shoremap[x][y]
sm = "1"+sm[1..4]
shoremap[x][y] = sm
End If
End If
If x+1 < mapwidth
If map[x+1][y] = 0
Local sm:String=shoremap[x][y]
sm = sm[0..1]+"1"+sm[2..4]
shoremap[x][y] = sm
End If
End If
If y+1 < mapheight
If map[x][y+1] = 0
Local sm:String=shoremap[x][y]
sm = sm[0..2]+"1"+sm[3..4]
shoremap[x][y] = sm
End If
End If
If x-1 >= 0
If map[x-1][y] = 0
Local sm:String=shoremap[x][y]
sm = sm[0..3]+"1"
shoremap[x][y] = sm
End If
End If
End If
Next
Next
End Method
End Class
Global mymapeditor:mapeditor = New mapeditor(20,14,32,32)
Class MyGame Extends App
Method OnCreate()
SetUpdateRate(60)
End Method
Method OnUpdate()
mymapeditor.update
End Method
Method OnRender()
Cls 0,0,0
mymapeditor.drawmap
SetColor 255,255,255
DrawText "Spacebar = tileview, 0 to 4 = tiles, Lmb = place tile",320,480-15,0.5,0.5
Local x:Int=640-32
Local y:Int=480-10
PushMatrix()
Translate x,y
Rotate(45)
Scale 0.7,0.7
Translate -x,-y
DrawText "Editor",x,y
PopMatrix()
End Method
End Class
Function Main()
New MyGame()
End Function
Function rectsoverlap:Bool(x1:Int, y1:Int, w1:Int, h1:Int, x2:Int, y2:Int, w2:Int, h2:Int)
If x1 >= (x2 + w2) Or (x1 + w1) <= x2 Then Return False
If y1 >= (y2 + h2) Or (y1 + h1) <= y2 Then Return False
Return True
End Function
Function drawboxedrect:Void(x:Int,y:Int,w:Int,h:Int)
DrawLine x,y,x+w,y
DrawLine x,y,x,y+h
DrawLine x,y+h,x+w,y+h
DrawLine x+w,y,x+w,y+h
End Function
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.