2D Collision, Physics, Rigid body dynamics

BlitzMax Forums/BlitzMax Programming/2D Collision, Physics, Rigid body dynamics

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

How is it going on collide?
Here is the first demo ported over in main.bmx:
(Maybe it will work at first go. It builds fine at least.)
SuperStrict
Include "mathutils.bmx"
Include "body.bmx"
Include "joint.bmx"
Include "arbiter.bmx"
Include "collide.bmx"
Include "World.bmx"

Graphics 800,600

Global DeltaTime:Float = 1.0 / 60.0

Global _World:TWorld = World(Vec2(0.0, -10.0), 10)
Global Bomb:TBody

'* Demo 1 "A single box"
Local Ground:TBody = Body()
Ground.Set(Vec2(100.0, 20.0), FLT_MAX)
Ground.Position.Set(0.0, -0.5 * Ground.Width.Y)
_World.Add(Ground)

Local Box:TBody = Body()
Box.Set(Vec2(1.0, 1.0), 100.0)
Box.position.Set(0.0, 4.0)
_World.Add(Box)

While Not KeyHit(KEY_ESCAPE)
	If KeyHit(KEY_SPACE)
		LaunchBomb
	End If
	
	Cls
	_World._Step(DeltaTime)
	For Local b:TBody = EachIn _World.bodies
		DrawBody(b)
	Next
	For Local j:TJoint = EachIn _World.joints
		DrawJoint(j)
	Next
	DrawText("Demo 1",0,0)
	DrawText("Press Space to Launch the Bomb",0,15)
	Flip
Wend

Function DrawBody (body:Tbody)
	Local R:TMat22 = Mat22_Angle(body.rotation)
	Local x:TVec2 = body.Position
	Local h:TVec2 = MultFloatVec2(0.5, body.width)

	Local v1:TVec2 = AddVec2Vec2(x, MultMat22Vec2(R, Vec2(-h.x, -h.y)))
	Local v2:TVec2 = AddVec2Vec2(x, MultMat22Vec2(R, Vec2(h.x, -h.y)))
	Local v3:TVec2 = AddVec2Vec2(x, MultMat22Vec2(R, Vec2(h.x, h.y)))
	Local v4:TVec2 = AddVec2Vec2(x, MultMat22Vec2(R, Vec2(-h.x, h.y)))

	If (body = Bomb)
		SetColor 128,255,128
	Else
		SetColor 200,200,255
	End If
	
	DrawLine v1.x, v1.y, v2.x, v2.y
	DrawLine v2.x, v2.y, v3.x, v3.y
	DrawLine v3.x, v3.y, v4.x, v4.y
	DrawLine v4.x, v4.y, v1.x, v1.y
End Function

Function DrawJoint (joint:TJoint)
	Local b1:TBody = joint.body1
	Local b2:TBody = joint.body2

	Local R1:TMat22 Mat22_Angle(b1.rotation)
	Local R2:TMat22 Mat22_Angle(b2.rotation)

	Local x1:TVec2 = b1.position
	Local p1:TVec2 = AddVec2Vec2(x1, MultMat22Vec2(R1, joint.localAnchor1))

	Local x2:TVec2 = b2.position
	Local p2:TVec2 = AddVec2Vec2(x2, MultMat22Vec2(R2, joint.localAnchor2))

	SetColor 128,128,200

	DrawLine x1.x, x1.y, p1.x, p1.y
	DrawLine p1.x, p1.y, x2.x, x2.y
	DrawLine x2.x, x2.y, p2.x, p2.y
	DrawLine p2.x, p2.y, x1.x, x1.y
End Function

Function LaunchBomb ()
	If (Not bomb)
		Bomb = Body()
		Bomb.Set(Vec2(1.0, 1.0), 50.0)
		Bomb.Friction = 0.2
		_World.Add(Bomb)
	End If

	Bomb.position.Set(Random2(-15.0, 15.0), 15.0)
	Bomb.rotation = Random2(-1.5, 1.5)
	Bomb.velocity = MultFloatVec2(-1.5, Bomb.position)
	Bomb.angularVelocity = Random2(-20.0, 20.0)
End Function