2D collision +velocities
Monkey Forums/Monkey Programming/2D collision +velocities
| ||
| So I was trying to impement 2d array-like map from Pakz thread and it was okay untill I introduced velocity to the engine. Falling speed would accelerate and if it was fast enough it would ommit collision with any block that is not bigger that the velocity of the player's falling speed and if it was bigger the player would just get stuck in that block. Solution: Add velocity parameter to RectsOverLap function so it counts ahead. Codefile thf.monkey Strict
Import mojo
Import imp.controls
Const mapwidth:Int=20
Const mapheight:Int=20
Global tilewidth:Float
Global tileheight:Float
Global _player1:_player
'╔══════════════════════════════════════════════════════════════════════════════════════════╗ '
Class SYS_Executable Extends App
Method OnCreate:Int()
SetUpdateRate(60)
tilewidth = DeviceWidth()/mapwidth
tileheight = DeviceHeight()/mapheight
_player1 = New _player
Return 0
End Method
Method OnUpdate:Int()
_player1.Control()
Return 0
End Method
Method OnRender:Int()
Cls 000,000,000
For Local y:Int = 0 Until mapheight
For Local x:Int = 0 Until mapwidth
SetColor 255,255,255
If Level001[y][x] = 1 Then DrawRect(x*tilewidth,y*tileheight,tilewidth,tileheight)
SetColor 060,060,255
DrawRect(x*tilewidth,y*tileheight,5,5)
End
End
_player1.Draw()
Return 0
End Method
End Class
'╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ '
Function Main:Int() ; New SYS_Executable() ; Return 0 ; End Function
Function RectsOverLap:Bool(x1:Float,y1:Float,w1:Float,h1:Float,x2:Float,y2:Float,w2:Float,h2:Float)
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
Global Level001:Int[][] = [ [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,9,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,1],
[1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,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] ]
Content of Imp/controls Strict Import thf Class _player Field _pX:Float Field _pY:Float Field _pXv:Float = 0 Field _pYv:Float = 0 Field _pS:Int = 0 Field _pW:Int = 8 Method New() For Local y:Int = 0 Until mapheight For Local x:Int = 0 Until mapwidth If Level001[y][x] = 9 Then _pX = x*tilewidth ; _pY = y*tileheight End End End Method Method Control:Void() _pYv += 0.5 _pXv *= 0.8 If KeyHit(KEY_SPACE) Then _pYv = -10 If KeyDown(KEY_A) Then _pXv -= 1 If KeyDown(KEY_D) Then _pXv += 1 For Local y:Int = 0 Until mapheight For Local x:Int = 0 Until mapwidth If RectsOverLap(_pX-_pW,_pY-_pW*2+_pYv,_pW*2,_pW*2,x*tilewidth,y*tileheight,tilewidth,tileheight) And Level001[y][x] = 1 If _pYv > 0 Then _pYv = 0 If _pYv < 0 Then _pYv = 0 '_pY = y*tileheight Endif If RectsOverLap(_pX-_pW+_pXv,_pY-_pW*2-1,_pW*2,_pW*2,x*tilewidth,y*tileheight,tilewidth,tileheight) And Level001[y][x] = 1 If _pXv < 0 Then _pXv = 0 Endif If RectsOverLap(_pX-_pW+_pXv,_pY-_pW*2-1,_pW*2,_pW*2,x*tilewidth,y*tileheight,tilewidth,tileheight) And Level001[y][x] = 1 If _pXv > 0 Then _pXv = 0 Endif End End _pX += _pXv _pY += _pYv End Method Method Draw:Void() SetColor 255,255,255 DrawCircle _pX,_pY-_pW,_pW SetAlpha 0.4 SetColor 255,000,000 DrawRect _pX-_pW,_pY-_pW*2+_pYv,_pW*2,_pW*2 SetColor 000,255,000 DrawRect _pX-_pW+_pXv,_pY-_pW*2-1,_pW*2,_pW*2 SetColor 000,000,255 DrawRect _pX-_pW+_pXv,_pY-_pW*2-1,_pW*2,_pW*2 SetAlpha 1 End Method End Class |