Here a example of how you can have rotating platforms in platformer games. The alignment of the player on a rotating platform is not quite fixed yet but maybe I will find the fix.
Code below :
Import mojo Const tilewidth = 32 Const tileheight = 32 Const mapwidth:Int=20 Const mapheight:Int=10 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,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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 players Field x:Float = 640/2-16 Field y:Float = 480/2 Field pw:Int=32 Field ph:Int=32 Field incy:Float Field jump:Bool=False Method New() End Method Method update() playermovement playergravity End Method Method playergravity() ' If the player is on the ground and the space bar is pressed If jump = False And playertc(0,1) = False And colrp(0,1,False) = False jump = True incy = 0 For Local i:=Eachin rotplat i.lockplayer=False Next End If If jump = False And KeyDown(KEY_SPACE) = True incy = -4 jump = True For Local i:=Eachin rotplat i.lockplayer=False Next End 'If the player is in the jump If jump = True incy += 0.1 'if the player is going up If incy <=0 For Local i:Int = 0 Until Abs(incy) y -= 1 If playertc(0,-1) = True incy = 0 Exit End If End End ' if the player if going down If incy > 0 For Local i:Int = 0 Until incy y += 1 'if the player touches the ground If playertc(0,1) = True jump = False Exit End 'if the player lands on a rotating platform If colrp(0,1,True) = True jump = False Exit End If End End End End Method Method playermovement() If KeyDown(KEY_RIGHT) For Local i=0 Until 2 If playertc(1,0) = False x+=1 End If Next End If If KeyDown(KEY_LEFT) For Local i=0 Until 2 If playertc(-1,0) = False x-=1 End If Next End If 'if locked to rotating platform then modify position For Local i:=Eachin rotplat If i.lockplayer = True y=i.py-ph x+=i.px-i.lx End If Next End Method Method playertc:Bool(x1:Int,y1:Int) Local cx = (x + x1) / tilewidth Local cy = (y + 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(x+x1,y+y1,pw,ph,x2*tilewidth, y2*tileheight,tilewidth,tileheight) = True Return True End If End If End If Next Next Return False End Method Method colrp:Bool(x1:Int,y1:Int,set:Bool=False) 'player colide with rotating platforms For Local i:=Eachin rotplat If rectsoverlap(x+x1,y+y1+ph,pw,1,i.px,i.py,i.pw,1) = True Then If set=True Then i.lockplayer = True Return True End If Next Return False End Method Method draw() ' draw the player SetColor 255,255,0 DrawOval x,y,pw,ph End Method End Class Class rotatingplatforms Field x:Float,y:Float,angle:Int Field px:Float,py:Float,pw:Int=32,ph:Int=12 Field lx:Float Field lockplayer:Bool=False Method New(x:Float,y:Float,angle:Int) Self.x = x Self.y = y Self.angle = angle End Method Method update() angle+=1 If angle>360 Then angle=angle-360 If angle<0 Then angle=angle+360 lx = px px = x+(Cos(angle)*64) py = y+(Sin(angle)*64) End Method Method draw() SetColor 255,255,255 DrawRect px,py,pw,ph End Method End Class Global player:List<players> = New List<players> Global rotplat:List<rotatingplatforms> = New List<rotatingplatforms> Class MyGame Extends App Method OnCreate() SetUpdateRate(60) player.AddLast(New players()) rotplat.AddLast(New rotatingplatforms(10*tilewidth,5*tileheight,0)) rotplat.AddLast(New rotatingplatforms(10*tilewidth,5*tileheight,(360/3)*1)) rotplat.AddLast(New rotatingplatforms(10*tilewidth,5*tileheight,(360/3)*2)) End Method OnUpdate() ' Player left and right movement For Local i:=Eachin player i.update Next For Local i:=Eachin rotplat i.update Next End Method OnRender() Cls(0,0,0) SetColor(255,255,255) ' draw the map For Local y:Int = 0 Until mapheight For Local x:Int = 0 Until mapwidth If map[y][x] = 1 Then DrawRect(x*tilewidth,y*tileheight,tilewidth,tileheight) End End DrawText "Platformer Example",10,10 DrawText "Use cursor left/right and space bar",160,10 For Local i:=Eachin rotplat i.draw Next For Local i:=Eachin player i.draw Next End End 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
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.