Here a short example on how to do topdown tilemaps with player movement. Use the cursor keys to move the player through the map. The player can not go through solid tiles.
Code below :
Import mojo Global playerx:Float = 6*32 Global playery:Float = 11*32 Const playerwidth:Int = 32 Const playerheight:Int = 32 Const screenwidth = 640 Const screenheight = 480 Const tilewidth = 32 Const tileheight = 32 Const mapwidth:Int=20 Const mapheight:Int=15 Global map:Int[][] = [ [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1], [1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,1], [1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,1], [1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1], [1,0,1,1,1,1,1,1,1,0,0,0,1,1,0,0,1,1,1,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1], [1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1], [1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,0,0,1], [1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1], [1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,0,0,0,1], [1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1], [1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] ] Class MyGame Extends App Method OnCreate() SetUpdateRate(60) End Method Method OnUpdate() For Local i=0 Until 2 If KeyDown(KEY_UP) If playertc(0,-1) = False playery-=1 End If End If If KeyDown(KEY_DOWN) If playertc(0,1) = False playery+=1 End If End If If KeyDown(KEY_LEFT) If playertc(-1,0) = False playerx-=1 End If End If If KeyDown(KEY_RIGHT) If playertc(1,0) = False playerx+=1 End If End If Next End Method Method OnRender() Cls 0,0,0 drawmap drawplayer SetColor 255,255,255 DrawText "Topdown tilemap and player movement - Use Cursor Keys to move",10,10 End Method End Class Function drawplayer:Void() SetColor 255,255,0 DrawOval playerx,playery,playerwidth,playerheight End Function Function drawmap:Void() SetColor 255,255,255 For Local y=0 Until mapheight For Local x=0 Until mapwidth If map[y][x] = 1 DrawRect x*tilewidth,y*tileheight,tilewidth,tileheight End If Next Next End Function ' This function returns true if the player coordinates are inside a tile on the map. Function playertc:Bool(x1:Int=0,y1:Int=0) Local cx = (playerx + x1) / tilewidth Local cy = (playery + y1) / tileheight For Local y2=cy-1 Until cy+2 For Local x2=cx-1 Until cx+2 If x2>=0 And x2<mapwidth And y2>=0 And y2<mapheight If map[y2][x2] > 0 If rectsoverlap(playerx+x1,playery+y1,playerwidth,playerheight,x2*tilewidth,y2*tileheight,tilewidth,tileheight) = True Return True End If End If End If Next Next Return False 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 Main() New MyGame() End Function
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.