// Use this for initialization protected override void Init() { var ground = API.CreateBody(world, new Vector2(0,0), 0, BodyType.STATIC_BODY ); BodyDef bd = new BodyDef(BodyType.DYNAMIC_BODY); bd.allowSleep = false; bd.position = new Vector2(0,10); m_body = API.CreateBody(world, bd); API.AddBoxShape(m_body,0.5f,10.0f,new Vector2(10.0f,0),0,new ShapeDef(5.0f)); API.AddBoxShape(m_body,0.5f,10.0f,new Vector2(-10.0f,0),0,new ShapeDef(5.0f)); API.AddBoxShape(m_body,10.0f,0.5f,new Vector2(0,10),0,new ShapeDef(5.0f)); API.AddBoxShape(m_body,10.0f,0.5f,new Vector2(0,-10),0,new ShapeDef(5.0f)); RevoluteJointDef rjd = new RevoluteJointDef(IntPtr.Zero, IntPtr.Zero); rjd.bodyA = ground; rjd.bodyB = m_body; rjd.localAnchorA = new Vector2(0,10); rjd.localAnchorB = Vector2.zero; rjd.referenceAngle = 0; rjd.motorSpeed = 0.05f * Mathf.PI; rjd.maxMotorTorque = 1e8f; rjd.enableMotor = true; API.CreateRevoluteJoint(world, rjd); }
public void Start() { if (!started) { started = true; BodyDef def = new BodyDef( type ); def.position = transform.position; def.angle = transform.localEulerAngles.z*Mathf.Deg2Rad; def.linearVelocity = linearVelocity; def.angularVelocity = angularVelocity; def.linearDamping = linearDamping; def.angularDamping = angularDamping; def.allowSleep = allowSleep; def.awake = awake; def.fixedRotation = fixedRotation; def.bullet = bullet; def.active = active; def.userData = 0; def.gravityScale = gravityScale; body = API.CreateBody(B2DWorld.instance.world, def); } }
public static IntPtr CreateBody( IntPtr w, Vector2 pos, float angle, BodyType type) { BodyDef bd = new BodyDef(type); bd.position = pos; bd.angle = angle; return CreateBody(w,bd); }
public static extern IntPtr CreateBody( IntPtr w, BodyDef def);
// Use this for initialization protected override void Init() { API.SetGravity(world,Vector2.zero); var ground = API.CreateBody(world, new Vector2(0,20), 0, BodyType.STATIC_BODY ); ShapeDef sp = new ShapeDef(0); sp.restitution = 0.4f; API.AddEdgeShape(ground, new Vector2(-20,-20), new Vector2(-20,20), sp); API.AddEdgeShape(ground, new Vector2(20,-20), new Vector2(20,20), sp); API.AddEdgeShape(ground, new Vector2(-20,20), new Vector2(20,20), sp); API.AddEdgeShape(ground, new Vector2(-20,-20), new Vector2(20,-20), sp); BodyDef bd = new BodyDef(BodyType.DYNAMIC_BODY); bd.allowSleep = false; bd.angle = 3.14159265359f; bd.angularDamping = 5.0f; bd.linearDamping = 0.1f; bd.position = new Vector2(0,2); m_body = API.CreateBody(world,bd); sp.restitution = 0.0f; sp.density = 4.0f; b2Transform xf1 = new b2Transform(); xf1.q = new b2Rot(0.3524f * Mathf.PI); xf1.p = xf1.q.GetXAxis(); Vector2[] vertices = new Vector2[3]; vertices[0] = b2Math.b2Mul(xf1, new Vector2(-1.0f, 0.0f)); vertices[1] = b2Math.b2Mul(xf1, new Vector2(1.0f, 0.0f)); vertices[2] = b2Math.b2Mul(xf1, new Vector2(0.0f, 0.5f)); API.AddPolygonShape(m_body, vertices, vertices.Length, sp); sp.density = 2.0f; xf1.q = new b2Rot(-0.3524f * Mathf.PI); xf1.p = -xf1.q.GetXAxis(); vertices[0] = b2Math.b2Mul(xf1, new Vector2(-1.0f, 0.0f)); vertices[1] = b2Math.b2Mul(xf1, new Vector2(1.0f, 0.0f)); vertices[2] = b2Math.b2Mul(xf1, new Vector2(0.0f, 0.5f)); API.AddPolygonShape(m_body, vertices, vertices.Length, sp); sp.density = 1.0f; sp.friction = 0.3f; float gravity = 10; FrictionJointDef jd = new FrictionJointDef(); for(int i=0; i<10; ++i) { var b = API.CreateBody(world, new Vector2(0,5.0f+1.54f*i), 0, BodyType.DYNAMIC_BODY ); API.AddBoxShape(b, 0.5f, 0.5f, Vector2.zero, 0, sp); float I = API.GetInertia(b); float mass = API.GetMass(b); float radius = Mathf.Sqrt(2.0f*I/mass); jd.bodyA = ground; jd.bodyB = b; jd.collideConnected = true; jd.maxForce = mass*gravity; jd.maxTorque = mass*radius*gravity; API.CreateFrictionJoint(world,jd); } }
void CreateLeg(float s, Vector2 wheelAnchor) { Vector2 p1 = new Vector2(5.4f * s, -6.1f); Vector2 p2 = new Vector2(7.2f * s, -1.2f); Vector2 p3 = new Vector2(4.3f * s, -1.9f); Vector2 p4 = new Vector2(3.1f * s, 0.8f); Vector2 p5 = new Vector2(6.0f * s, 1.5f); Vector2 p6 = new Vector2(2.5f * s, 3.7f); ShapeDef sp = new ShapeDef(1.0f); sp.groupIndex = -1; Vector2[] vertices1 = new Vector2[3]; Vector2[] vertices2 = new Vector2[3]; if( s > 0.0f ) { vertices1[0] = p1; vertices1[1] = p2; vertices1[2] = p3; vertices2[0] = Vector2.zero; vertices2[1] = p5-p4; vertices2[2] = p6-p4; } else { vertices1[0] = p1; vertices1[1] = p3; vertices1[2] = p2; vertices2[0] = Vector2.zero; vertices2[1] = p6-p4; vertices2[2] = p5-p4; } BodyDef bd1 = new BodyDef(BodyType.DYNAMIC_BODY); BodyDef bd2 = new BodyDef(BodyType.DYNAMIC_BODY); bd1.position = m_offset; bd2.position = p4 + m_offset; bd1.angularDamping = 10.0f; bd2.angularDamping = 10.0f; var body1 = API.CreateBody(world,bd1); var body2 = API.CreateBody(world,bd2); API.AddPolygonShape(body1, vertices1,vertices1.Length,sp); API.AddPolygonShape(body2, vertices2,vertices2.Length,sp); DistanceJointDef djd = new DistanceJointDef(); djd.dampingRatio = 0.5f; djd.frequencyHz = 10.0f; djd.Initialize(body1,body2,p2+m_offset, p5+m_offset); API.CreateDistanceJoint(world, djd ); djd.Initialize(body1, body2, p3 + m_offset, p4 + m_offset); API.CreateDistanceJoint(world, djd ); djd.Initialize(body1, m_wheel, p3 + m_offset, wheelAnchor + m_offset); API.CreateDistanceJoint(world, djd ); djd.Initialize(body2, m_wheel, p6 + m_offset, wheelAnchor + m_offset); API.CreateDistanceJoint(world, djd ); RevoluteJointDef rjd = new RevoluteJointDef(); rjd.Initialize(body2, m_chassis,p4+m_offset); API.CreateRevoluteJoint(world,rjd); }