Wednesday, January 14, 2015

Monkey-X - circlerectcollide collision function code example

On stackoverflow I found a function that sees if a rectangle is inside a circle. It was not that complex. I converted it to Monkey. In the example below you can move a rectangle that is underneath the mouse in a circle and if it collides then a message is shown on the screen.

I needed this function for a Pang (Old amiga game) remake.

Code below :

Import mojo

Global circlex:Int=320
Global circley:Int=240
Global circleradius:Int=50

Class MyGame Extends App

    Method OnCreate()
    End Method
    Method OnUpdate()        
    End Method
    Method OnRender()
        Cls 0,0,0 
        SetColor 255,255,255
        DrawText "Move the rectangle in the circle to see collision.",0,0
        Local coll:Bool=circlerectcollide(circlex,circley,circleradius,MouseX(),MouseY(),50,50)
        If coll=True
            DrawText "Collision",2,16
        End If
        DrawRect MouseX(),MouseY(),50,50
        DrawCircle circlex,circley,circleradius
    End Method
End Class

Function circlerectcollide:Bool(cx:Int,cy:Int,cr:Int, rx:Int,ry:Int,rw:Int,rh:Int)
    Local closestx:Float = Clamp(cx, rx, rx+rw)
    Local closesty:Float = Clamp(cy, ry, ry+rh)
    Local distancex :Float = cx - closestx
    Local distancey:Float = cy - closesty
    Local distancesquared:Float = (distancex * distancex) + (distancey * distancey)
    Return distancesquared < (cr * cr)
End Function

Function Main()
    New MyGame()
End Function

No comments:

Post a Comment