Here a example of a scrolling platformer with climeable tiles.
Code below :
Import mojo Global map:Int[][] = [ [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1], [1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1], [1,1,0,0,0,0,0,0,0,2,0,1,1,1,1,1,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1], [1,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1], [1,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1], [1,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1], [1,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1], [1,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1], [1,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1], [1,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,1,1,1,1,1,1,0,0,0,2,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,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] ] Const mapwidth:Int=40 Const mapheight:Int=30 Const tilewidth:Int=32 Const tileheight:Int=32 Global mapx:Int=0 Global mapy:Int=0 Global mapsx:Int=0 Global mapsy:Int=0 Class player Field x:Float=32*3 Field y:Float=32*6 Field w:Int=32 Field h:Int=32 Field incy:Float=0 Field isjumping:Bool = False Field facing:Int '0 = left , 1 = right Field jumpofvine:Bool=False Field jumpofvinetimeout:Int Method update() If pvc(0,0) = False Or jumpofvine = True Then regularmode If pvc(0,0) = True If jumpofvine = False vinemode End If End If End Method Method vinemode() isjumping = False incy=0 If KeyDown(KEY_SPACE) jumpofvine = True jumpofvinetimeout = Millisecs() + 1000 isjumping = True incy=-4 End If If KeyDown(KEY_UP) For Local i=0 Until 4 If pvc(0,0) = True And ptc(0,-1) = False y-=1 End If Next End If If KeyDown(KEY_DOWN) For Local i=0 Until 4 If pvc(0,0) = True And ptc(0,1) = False y+=1 End If Next End If If KeyDown(KEY_LEFT) For Local i=0 Until 4 If pvc(0,0) = True And ptc(-1,0) = False x-=1 facing=0 End If Next End If If KeyDown(KEY_RIGHT) For Local i=0 Until 4 If pvc(0,0) = True And ptc(1,0) = False x+=1 facing = 1 End If Next End If End Method Method regularmode() If jumpofvine = True If Millisecs() > jumpofvinetimeout Then jumpofvine=False End If 'Left and Right movement If KeyDown(KEY_RIGHT) For Local i=0 Until 4 ' move with 4 pixels at a time If ptc(1,0) = False x+=1 facing = 1 End If Next End If If KeyDown(KEY_LEFT) For Local i=0 Until 4 If ptc(-1,0) = False x-=1 facing = 0 End If Next End If 'player gravity part 'if in the air and not in jump If isjumping = False If ptc(0,1) = False isjumping=True incy=0 End If End If ' jump If KeyDown(KEY_SPACE) If isjumping = False isjumping = True incy=-4 End If End If ' if we are in a jump/falling down If isjumping=True If incy>=0 'if we are going down If incy<4 Then incy+=.1 For Local i=0 Until(incy) If ptc(0,1) = False y+=1 Else isjumping = False End If Next End If If incy<0 'if we are going up incy+=.1 For Local i=0 Until Abs(incy) If ptc(0,-1) = False y-=1 Else incy=0 End If Next End If End If End Method Method draw() SetColor 255,255,0 DrawRect x,y,w,h End Method End Class Global p:player = New player Class MyGame Extends App Method OnCreate() SetUpdateRate(60) End Method Method OnUpdate() p.update alignmap End Method Method OnRender() Cls 0,0,0 drawmap p.draw SetColor 0,0,0 DrawRect 0,0,DeviceWidth(),32 SetColor 255,255,255 DrawText "Use Cursor left/right to move, space to jump",0,0 DrawText "Use the green(vines) to climb around. ",0,16 End Method End Class Function alignmap:Bool() For Local i=0 Until 4 If p.x > DeviceWidth / 2 If mapx+20 < mapwidth-1 mapsx-=1 If mapsx < 0 Then mapsx = 31 mapx += 1 Endif p.x-=1 End If End If Next For Local i=0 Until 4 If p.x < DeviceWidth / 2 If mapx > 0 mapsx+=1 If mapsx > 32 Then mapsx = 0 mapx -= 1 Endif p.x+=1 End If End If Next ' scrolling down For Local i=0 Until 16 If p.y > DeviceHeight / 2 If mapy+14 < mapheight-1 mapsy-=1 If mapsy < 0 Then mapsy = 31 mapy += 1 Endif p.y-=1 End If End If Next ' scrolling up For Local i=0 Until 16 If p.y < DeviceHeight / 2 If mapy > 0 mapsy+=1 If mapsy > 31 Then mapsy = 0 mapy -= 1 Endif p.y+=1 End If End If Next End Function 'player collide with vines blocks true/false Function pvc:Bool(offsetx:Int=0,offsety:Int=0) Local cx = (p.x+offsetx)/tilewidth+mapx Local cy = (p.y+offsety)/tileheight+mapy For Local y2=cy-1 Until cy+4 For Local x2=cx-1 Until cx+4 If x2>=0 And x2<mapwidth And y2>=0 And y2<mapheight If map[y2][x2] = 2 Local x3 = (x2-mapx)*tilewidth-32+mapsx Local y3 = (y2-mapy)*tileheight+mapsy If rectsoverlap(p.x+offsetx,p.y+offsety,p.w,p.h,x3,y3,tilewidth,tileheight) = True Return True End If End If End If Next Next Return False End Function 'player collide with solid blocks true/false Function ptc:Bool(offsetx:Int=0,offsety:Int=0) Local cx = (p.x+offsetx)/tilewidth+mapx Local cy = (p.y+offsety)/tileheight+mapy For Local y2=cy-1 Until cy+4 For Local x2=cx-1 Until cx+4 If x2>=0 And x2<mapwidth And y2>=0 And y2<mapheight If map[y2][x2] = 1 Local x3 = (x2-mapx)*tilewidth-32+mapsx Local y3 = (y2-mapy)*tileheight+mapsy If rectsoverlap(p.x+offsetx,p.y+offsety,p.w,p.h,x3,y3,tilewidth,tileheight) = True Return True End If End If End If Next Next Return False End Function Function drawmap:Void() For Local y=0 To 14 For Local x=0 To 20 Local x1 = ((x*tilewidth)+mapsx)-tilewidth Local y1 = ((y*tileheight)+mapsy) Select map[y+mapy][x+mapx] Case 1'Wall SetColor 100,100,100 DrawRect x1,y1,tilewidth,tileheight Case 2'spriny SetColor 0,100,0 DrawRect x1,y1,tilewidth,tileheight End Select Next Next 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 Main() New MyGame() End Function
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.