public VaryingRestitution() { { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); shape.Radius = 1.0f; FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 1.0f; float[] restitution = {0.0f, 0.1f, 0.3f, 0.5f, 0.75f, 0.9f, 1.0f}; for (int i = 0; i < 7; ++i) { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(-10.0f + 3.0f * i, 20.0f); Body body = m_world.CreateBody(bd); fd.Restitution = restitution[i]; fd.UserData = i; body.CreateFixture(fd); } } }
public LineJoint() { Body ground = null; { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); BodyDef bd = new BodyDef(); ground = m_world.CreateBody(bd); ground.CreateFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 2.0f); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(0.0f, 7.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 1.0f); LineJointDef jd = new LineJointDef(); Vec2 axis = new Vec2(2.0f, 1.0f); axis.Normalize(); jd.Initialize(ground, body, new Vec2(0.0f, 8.5f), axis); jd.MotorSpeed = 0.0f; jd.MaxMotorForce = 100.0f; jd.EnableMotor = true; jd.LowerTranslation = -4.0f; jd.UpperTranslation = 4.0f; jd.EnableLimit = true; m_world.CreateJoint(jd); } }
public SphereStack() { { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); for (int i = 0; i < e_count; ++i) { shape.Radius = Rand.RandomFloat(0.5f, 0.5f); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(0.0f, 4.0f + 3.0f * i); m_bodies[i] = m_world.CreateBody(bd); m_bodies[i].CreateFixture(shape, 1.0f); } } }
public Confined() { { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); // Floor shape.SetAsEdge(new Vec2(-10.0f, 0.0f), new Vec2(10.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); // Left wall shape.SetAsEdge(new Vec2(-10.0f, 0.0f), new Vec2(-10.0f, 20.0f)); ground.CreateFixture(shape, 0.0f); // Right wall shape.SetAsEdge(new Vec2(10.0f, 0.0f), new Vec2(10.0f, 20.0f)); ground.CreateFixture(shape, 0.0f); // Roof shape.SetAsEdge(new Vec2(-10.0f, 20.0f), new Vec2(10.0f, 20.0f)); ground.CreateFixture(shape, 0.0f); } m_world.Gravity = new Vec2(0.0f, 0.0f); }
public MovingJoint() { var capeFixture = new FixtureDef(new PolygonShape(0.08f, 0.4f, (float)(Math.PI)), 0.2f); var capeBody = new BodyDef(BodyType.Dynamic, new Vec2(0, 10)); Body testbody = m_world.CreateBody(capeBody); testbody.CreateFixture(capeFixture); staticBody = m_world.CreateBody(new BodyDef(BodyType.Static, testbody.WorldCenter + new Vec2(-0.08f / 25, 0.4f))); staticBody.CreateFixture(new CircleShape(0.15f), 0); { RevoluteJointDef rjd = new RevoluteJointDef(); rjd.Initialize(testbody, staticBody, testbody.WorldCenter + new Vec2(0.0f, 0.4f)); joint = (RevoluteJoint)m_world.CreateJoint(rjd); } // build cape Body lastBody = testbody; for (int i = 0; i < 8; ++i) { capeBody.Position = new Vec2(capeBody.Position.X, capeBody.Position.Y - 0.8f); var nextBody = m_world.CreateBody(capeBody); nextBody.CreateFixture(capeFixture); var joint = new RevoluteJointDef(); joint.Initialize(lastBody, nextBody, nextBody.WorldCenter + new Vec2(0.0f, 0.4f)); m_world.CreateJoint(joint); lastBody = nextBody; } }
public Revolute() { System.Collections.Generic.List<JointDef> joints = new System.Collections.Generic.List<JointDef>(); Body ground = null; { BodyDef bd = new BodyDef(); ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); shape.Radius = 0.5f; BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; RevoluteJointDef rjd = new RevoluteJointDef(); bd.Position = new Vec2(0.0f, 20.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 5.0f); float w = 100.0f; body.AngularVelocity = w; body.LinearVelocity = new Vec2(-8.0f * w, 0.0f); rjd.Initialize(ground, body, new Vec2(0.0f, 12.0f)); rjd.MotorSpeed = 1.0f * (float)Math.PI; rjd.MaxMotorTorque = 10000.0f; rjd.EnableMotor = false; rjd.LowerAngle = -0.25f * (float)Math.PI; rjd.UpperAngle = 0.5f * (float)Math.PI; rjd.EnableLimit = true; rjd.CollideConnected = true; m_joint = (RevoluteJoint)m_world.CreateJoint(rjd); joints.Add(rjd); } using (System.IO.FileStream fs = new System.IO.FileStream("out.xml", System.IO.FileMode.Create)) { var serializer = Box2CS.Serialize.WorldSerializer.SerializeWorld(m_world, new Box2CS.Serialize.WorldXmlSerializer()); foreach (var j in joints) serializer.AddJoint(j); serializer.Serialize(fs); } }
/// Main... public ElasticBody() { Program.MainForm.ViewZoom = 0.25f; /// Bottom static body { PolygonShape sd = new PolygonShape(); sd.SetAsBox(50.0f, 2.0f); BodyDef bd = new BodyDef(); bd.Position = new Vec2(-1.0f, -7.5f); m_ground = m_world.CreateBody(bd); m_ground.CreateFixture(new FixtureDef(sd, 0.0f, 0.1f, 0.1f)); } /// "Elastic body" 64 bodies - something like a lin. elastic compound /// connected via dynamic forces (springs) { PolygonShape sd = new PolygonShape(); sd.SetAsBox(width, height); FixtureDef sdf = new FixtureDef(); sdf.Density = 1.5f; sdf.Friction = 0.01f; sdf.Filter.GroupIndex = -1; sdf.Shape = sd; Vec2 startpoint = new Vec2(0, 0); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Bullet = false; //bd.AllowSleep = false; for (int i = 0; i < BodyCountY; ++i) { for (int j = 0; j < BodyCountX; ++j) { bd.Position = new Vec2(j*(width*2), 2.51f + (height*2) * i); bd.Position += startpoint; Body body = m_world.CreateBody(bd); bodies[BodyCountX*i+j] = body; body.CreateFixture(sdf); } } } }
public Prismatic() { Body ground = null; { BodyDef bd = new BodyDef(); ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(2.0f, 0.5f); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(-10.0f, 10.0f); bd.Angle = 0.5f * (float)Math.PI; bd.AllowSleep = false; Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 5.0f); PrismaticJointDef pjd = new PrismaticJointDef(); // Bouncy limit Vec2 axis = new Vec2(2.0f, 1.0f); axis.Normalize(); pjd.Initialize(ground, body, new Vec2(0.0f, 0.0f), axis); // Non-bouncy limit //pjd.Initialize(ground, body, new Vec2(-10.0f, 10.0f), new Vec2(1.0f, 0.0f)); pjd.MotorSpeed = 10.0f; pjd.MaxMotorForce = 10000.0f; pjd.EnableMotor = true; pjd.LowerTranslation = 0.0f; pjd.UpperTranslation = 20.0f; pjd.EnableLimit = false; m_joint = (PrismaticJoint)m_world.CreateJoint(pjd); } }
public SensorTest() { { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); shape.Radius = 5.0f; shape.Position = new Vec2(0.0f, 10.0f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.IsSensor = true; m_sensor = ground.CreateFixture(fd); } } { CircleShape shape = new CircleShape(); for (int i = 0; i < e_count; ++i) { shape.Radius = Rand.RandomFloat(0.85f, 1.0f); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(-10.0f + 3.0f * i, 20.0f); bd.UserData = i; m_touching[i] = false; m_bodies[i] = m_world.CreateBody(bd); m_bodies[i].CreateFixture(shape, 1.0f); } } }
public Body[] GenerateBodies(World world, Vec2 basePosition, FixtureDef def) { if (_vecs.Count <= 1) throw new ArgumentOutOfRangeException("Vecs"); Body[] bodies = new Body[_vecs.Count - 1]; for (int i = 0; i < _vecs.Count - 1; ++i) { PolygonShape edge = new PolygonShape(_vecs[i], _vecs[i + 1]); BodyDef bd = new BodyDef(); bd.Position = basePosition; bodies[i] = world.CreateBody(bd); bodies[i].CreateFixture(new FixtureDef(edge, 0, def.Restitution, def.Friction, false, def.UserData)); } return bodies; }
void CreateCircle() { float radius = 2.0f; CircleShape shape = new CircleShape(); shape.Position = Vec2.Empty; shape.Radius = radius; FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 1.0f; fd.Friction = 0.0f; Vec2 p = new Vec2(Rand.RandomFloat(), 3.0f + Rand.RandomFloat()); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = p; //bd.allowSleep = false; Body body = m_world.CreateBody(bd); body.CreateFixture(fd); }
public OneSidedPlatform() { // Ground { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } // Platform { BodyDef bd = new BodyDef(); bd.Position = new Vec2(0.0f, 10.0f); Body body = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsBox(3.0f, 0.5f); m_platform = body.CreateFixture(shape, 0.0f); m_top = 10.0f + 0.5f; } // Actor { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(0.0f, 12.0f); Body body = m_world.CreateBody(bd); m_radius = 0.5f; CircleShape shape = new CircleShape(); shape.Radius = m_radius; m_character = body.CreateFixture(shape, 20.0f); body.LinearVelocity = new Vec2(0.0f, -50.0f); } }
public ShapeEditing() { { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(0.0f, 10.0f); m_body = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsBox(4.0f, 4.0f, new Vec2(0.0f, 0.0f), 0.0f); m_fixture1 = m_body.CreateFixture(shape, 10.0f); m_fixture2 = null; } }
public TitleState(StateStack stack, Context context) : base(stack, context) { starttimer = new Clock(); starttimer.Restart(); titletext = new Text(); titletext.Scale = new Vector2f(2, 2); titletext.DisplayedString = "PIXELTASIM"; titletext.Font = mContext.mFonts.get(FontID.Title); titletext.centerOrigin(); titletext.Position = new Vector2f(mContext.mWindow.Size.X/2, mContext.mWindow.Size.Y / 8); titletext.Color = Color.Black; square = new RectangleShape(new Vector2f(UnitConverter.toPixScale(0.5f), UnitConverter.toPixScale(0.5f))); square.centerOrigin(); square.FillColor = Color.Red; square.OutlineColor = Color.Black; square.OutlineThickness = 1; b2World = new World(new Vec2(0, 10), false); BodyDef b2Def = new BodyDef(); b2Def.BodyType = BodyType.Dynamic; b2Def.Position = new Vec2(UnitConverter.toSimScale(mContext.mWindow.Size.X / 2), UnitConverter.toSimScale(mContext.mWindow.Size.Y / 8*3)); b2Body = b2World.CreateBody(b2Def); PolygonShape dynamicbox = new PolygonShape(); dynamicbox.SetAsBox(UnitConverter.toSimScale(32), UnitConverter.toSimScale(32)); FixtureDef fixDef = new FixtureDef(); fixDef.Shape = dynamicbox; fixDef.Density = 1; fixDef.Friction = 0.3f; b2Body.CreateFixture(fixDef); square.Position = new Vector2f(UnitConverter.toPixScale(b2Body.Position.X), UnitConverter.toPixScale(b2Body.Position.Y)); }
public VaryingFriction() { { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(13.0f, 0.25f); BodyDef bd = new BodyDef(); bd.Position = new Vec2(-4.0f, 22.0f); bd.Angle = -0.25f; Body ground = m_world.CreateBody(bd); ground.CreateFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.25f, 1.0f); BodyDef bd = new BodyDef(); bd.Position = new Vec2(10.5f, 19.0f); Body ground = m_world.CreateBody(bd); ground.CreateFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(13.0f, 0.25f); BodyDef bd = new BodyDef(); bd.Position = new Vec2(4.0f, 14.0f); bd.Angle = 0.25f; Body ground = m_world.CreateBody(bd); ground.CreateFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.25f, 1.0f); BodyDef bd = new BodyDef(); bd.Position = new Vec2(-10.5f, 11.0f); Body ground = m_world.CreateBody(bd); ground.CreateFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(13.0f, 0.25f); BodyDef bd = new BodyDef(); bd.Position = new Vec2(-4.0f, 6.0f); bd.Angle = -0.25f; Body ground = m_world.CreateBody(bd); ground.CreateFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.5f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 25.0f; float[] friction = {0.75f, 0.5f, 0.35f, 0.1f, 0.0f}; for (int i = 0; i < 5; ++i) { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(-15.0f + 4.0f * i, 28.0f); Body body = m_world.CreateBody(bd); fd.Friction = friction[i]; body.CreateFixture(fd); } } }
public Car() { { // car body PolygonShape poly1 = new PolygonShape(), poly2 = new PolygonShape(); // bottom half poly1.Vertices = new Vec2[] { new Vec2(2.2f,-0.74f), new Vec2(2.2f,-0.2f), new Vec2(1.0f,0), new Vec2(-2.2f,0), new Vec2(-2.2f,-0.74f) }; FixtureDef fixture1 = new FixtureDef(); fixture1.Filter.GroupIndex = -1; fixture1.Shape = poly1; fixture1.Density = 20.0f; fixture1.Friction = 0.68f; // top half poly2.Vertices = new Vec2[] { new Vec2(1.0f,0), new Vec2(0.5f,0.74f), new Vec2(-1.3f,0.7f), new Vec2(-1.7f,0), }; FixtureDef fixture2 = new FixtureDef(); fixture2.Filter.GroupIndex = -1; fixture2.Shape = poly2; fixture2.Density = 5.0f; fixture2.Friction = 0.68f; BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(0, 0); m_vehicle = m_world.CreateBody(bd); m_vehicle.CreateFixture(fixture1); m_vehicle.CreateFixture(fixture2); } { // vehicle wheels CircleShape circ = new CircleShape(); circ.Radius = 0.58608f; FixtureDef wheelFix = new FixtureDef(); wheelFix.Shape = circ; wheelFix.Density = 40.0f; wheelFix.Friction = 0.8f; wheelFix.Filter.GroupIndex = -1; BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.AllowSleep = false; bd.Position = new Vec2(1.2f, -0.8f); m_rightWheel = m_world.CreateBody(bd); m_rightWheel.CreateFixture(wheelFix); bd.Position = new Vec2(-1.2f, -0.8f); m_leftWheel = m_world.CreateBody(bd); m_leftWheel.CreateFixture(wheelFix); } { // join wheels to chassis RevoluteJointDef jd = new RevoluteJointDef(); jd.Initialize(m_vehicle, m_leftWheel, m_leftWheel.WorldCenter); jd.CollideConnected = false; jd.EnableMotor = true; jd.MaxMotorTorque = 10.0f; jd.MotorSpeed = 0.0f; m_leftJoint = (RevoluteJoint)m_world.CreateJoint(jd); jd.Initialize(m_vehicle, m_rightWheel, m_rightWheel.WorldCenter); jd.CollideConnected = false; m_rightJoint = (RevoluteJoint)m_world.CreateJoint(jd); } }
public EdgeShapes() { // Ground body { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); float x1 = -20.0f; float y1 = 2.0f * (float)Math.Cos(x1 / 10.0f * Math.PI); for (int i = 0; i < 80; ++i) { float x2 = x1 + 0.5f; float y2 = 2.0f * (float)Math.Cos(x2 / 10.0f * Math.PI); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(x1, y1), new Vec2(x2, y2)); ground.CreateFixture(shape, 0.0f); x1 = x2; y1 = y2; } } { Vec2[] vertices = new Vec2[3]; vertices[0] = new Vec2(-0.5f, 0.0f); vertices[1] = new Vec2(0.5f, 0.0f); vertices[2] = new Vec2(0.0f, 1.5f); m_polygons[0] = new PolygonShape(); m_polygons[0].Vertices = vertices; } { Vec2[] vertices = new Vec2[3]; vertices[0] = new Vec2(-0.1f, 0.0f); vertices[1] = new Vec2(0.1f, 0.0f); vertices[2] = new Vec2(0.0f, 1.5f); m_polygons[1] = new PolygonShape(); m_polygons[1].Vertices = vertices; } { float w = 1.0f; float b = w / (2.0f + (float)Math.Sqrt(2.0f)); float s = (float)Math.Sqrt(2.0f) * b; Vec2[] vertices = new Vec2[8]; vertices[0] = new Vec2(0.5f * s, 0.0f); vertices[1] = new Vec2(0.5f * w, b); vertices[2] = new Vec2(0.5f * w, b + s); vertices[3] = new Vec2(0.5f * s, w); vertices[4] = new Vec2(-0.5f * s, w); vertices[5] = new Vec2(-0.5f * w, b + s); vertices[6] = new Vec2(-0.5f * w, b); vertices[7] = new Vec2(-0.5f * s, 0.0f); m_polygons[2] = new PolygonShape(); m_polygons[2].Vertices = vertices; } { m_polygons[3] = new PolygonShape(); m_polygons[3].SetAsBox(0.5f, 0.5f); } { m_circle = new CircleShape(); m_circle.Radius = 0.5f; } m_bodyIndex = 0; m_angle = 0.0f; }
public BodyTypes() { Body ground = null; { BodyDef bd = new BodyDef(); ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f)); FixtureDef fd = new FixtureDef(); fd.Shape = shape; ground.CreateFixture(fd); } // Define attachment { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(0.0f, 3.0f); m_attachment = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 2.0f); m_attachment.CreateFixture(shape, 2.0f); } // Define platform { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(-4.0f, 5.0f); m_platform = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 4.0f, new Vec2(4.0f, 0.0f), 0.5f * (float)Math.PI); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Friction = 0.6f; fd.Density = 2.0f; m_platform.CreateFixture(fd); RevoluteJointDef rjd = new RevoluteJointDef(); rjd.Initialize(m_attachment, m_platform, new Vec2(0.0f, 5.0f)); rjd.MaxMotorTorque = 50.0f; rjd.EnableMotor = true; m_world.CreateJoint(rjd); PrismaticJointDef pjd = new PrismaticJointDef(); pjd.Initialize(ground, m_platform, new Vec2(0.0f, 5.0f), new Vec2(1.0f, 0.0f)); pjd.MaxMotorForce = 1000.0f; pjd.EnableMotor = true; pjd.LowerTranslation = -10.0f; pjd.UpperTranslation = 10.0f; pjd.EnableLimit = true; m_world.CreateJoint(pjd); m_speed = 3.0f; } // Create a payload { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(0.0f, 8.0f); m_payload = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.75f, 0.75f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Friction = 0.6f; fd.Density = 2.0f; m_payload.CreateFixture(fd); } }
public Test() { Vec2 gravity; gravity = new Vec2(0.0f, -10.0f); bool doSleep = true; m_world = new World(gravity, doSleep); m_bomb = null; m_textLine = 30; m_mouseJoint = null; m_pointCount = 0; m_destructionListener.test = this; m_world.DestructionListener = m_destructionListener; m_world.ContactListener = this; m_world.DebugDraw = m_debugDraw; m_bombSpawning = false; m_stepCount = 0; BodyDef bodyDef = new BodyDef(); m_groundBody = m_world.CreateBody(bodyDef); m_groundBody.UserData = "Ground"; }
public Dominos() { Body b1 = m_world.CreateBody(new BodyDef()); b1.CreateFixture(new PolygonShape(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)), 0.0f); b1.UserData = 1; { Body ground = m_world.CreateBody(new BodyDef(BodyType.Static, new Vec2(-1.5f, 10.0f))); ground.CreateFixture(new PolygonShape(6.0f, 0.25f), 0.0f); ground.UserData = "ground"; } for (int i = 0; i < 10; ++i) { Body body = m_world.CreateBody(new BodyDef(BodyType.Dynamic, new Vec2(-6.0f + 1.0f * i, 11.25f), 0)); body.CreateFixture(new FixtureDef(new PolygonShape(0.1f, 1.0f), 20.0f, 0.0f, 0.1f)); body.UserData = "domino " + i.ToString(); } { Body ground = m_world.CreateBody(new BodyDef(BodyType.Static, new Vec2(1.0f, 6.0f))); ground.CreateFixture(new PolygonShape(7.0f, 0.25f, Vec2.Empty, 0.3f), 0.0f); ground.UserData = "ground"; } Body b2; { b2 = m_world.CreateBody(new BodyDef(BodyType.Static, new Vec2(-7.0f, 4.0f))); b2.CreateFixture(new PolygonShape(0.25f, 1.5f), 0.0f); b2.UserData = b2; } Body b3; { b3 = m_world.CreateBody(new BodyDef(BodyType.Dynamic, new Vec2(-0.9f, 1.0f), -0.15f)); b3.CreateFixture(new PolygonShape(6.0f, 0.125f), 10.0f); b3.UserData = 3; } RevoluteJointDef jd = new RevoluteJointDef(); Vec2 anchor = new Vec2(-2.0f, 1.0f); jd.Initialize(b1, b3, anchor); jd.CollideConnected = true; m_world.CreateJoint(jd); Body b4; { b4 = m_world.CreateBody(new BodyDef(BodyType.Dynamic, new Vec2(-10.0f, 15.0f))); b4.CreateFixture(new PolygonShape(0.25f, 0.25f), 10.0f); b4.UserData = 4; } anchor = new Vec2(-7.0f, 15.0f); jd.Initialize(b2, b4, anchor); m_world.CreateJoint(jd); Body b5; { b5 = m_world.CreateBody(new BodyDef(BodyType.Dynamic, new Vec2(6.5f, 3.0f))); b5.CreateFixture(new FixtureDef(new PolygonShape(1.0f, 0.1f, new Vec2(0.0f, -0.9f), 0.0f), 10.0f, 0.0f, 0.1f)); b5.CreateFixture(new FixtureDef(new PolygonShape(0.1f, 1.0f, new Vec2(-0.9f, 0.0f), 0.0f), 10.0f, 0.0f, 0.1f)); b5.CreateFixture(new FixtureDef(new PolygonShape(0.1f, 1.0f, new Vec2(0.9f, 0.0f), 0.0f), 10.0f, 0.0f, 0.1f)); b5.UserData = 5; } anchor = new Vec2(6.0f, 2.0f); jd.Initialize(b1, b5, anchor); m_world.CreateJoint(jd); Body b6; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(1.0f, 0.1f); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(6.5f, 4.1f); b6 = m_world.CreateBody(bd); b6.CreateFixture(shape, 30.0f); b6.UserData = 6; } anchor = new Vec2(7.5f, 4.0f); jd.Initialize(b5, b6, anchor); m_world.CreateJoint(jd); Body b7; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.1f, 1.0f); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(7.4f, 1.0f); b7 = m_world.CreateBody(bd); b7.CreateFixture(shape, 10.0f); b7.UserData = 7; } DistanceJointDef djd = new DistanceJointDef(); djd.BodyA = b3; djd.BodyB = b7; djd.LocalAnchorA = new Vec2(6.0f, 0.0f); djd.LocalAnchorB = new Vec2(0.0f, -1.0f); Vec2 d = djd.BodyB.GetWorldPoint(djd.LocalAnchorB) - djd.BodyA.GetWorldPoint(djd.LocalAnchorA); djd.Length = d.Length(); m_world.CreateJoint(djd); { float radius = 0.2f; CircleShape shape = new CircleShape(); shape.Radius = radius; for (int i = 0; i < 4; ++i) { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(5.9f + 2.0f * radius * i, 2.4f); Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 10.0f); body.UserData = "circle"; } } }
public object Clone() { BodyDef def = new BodyDef(BodyType, Position, Angle, LinearVelocity, AngularVelocity, LinearDamping, AngularDamping, Bullet, Active, FixedRotation, AllowSleep, Awake, InertiaScale, UserData); return def; }
public Cloth() { FixtureDef boxFix = new FixtureDef(new CircleShape(ClothBodySize), 0.2f); BodyDef boxBod = new BodyDef(BodyType.Dynamic, Vec2.Empty); boxFix.Filter.GroupIndex = -1; boxBod.Position = new Vec2(-ClothTotalWidth / 2, 30); Body bar; { bar = m_world.CreateBody(new BodyDef(BodyType.Static, new Vec2(-ClothBodySpacingWidth / 2, 30))); var fd = new FixtureDef(new PolygonShape((ClothTotalWidth / 2) + ClothBodySpacingWidth, 0.25f)); fd.Filter.GroupIndex = -1; bar.CreateFixture(fd); } for (int y = 0; y < ClothSegmentsHeight; ++y) { for (int x = 0; x < ClothSegmentsWidth; ++x) { Body body = m_world.CreateBody(boxBod); boxBod.Position += new Vec2(ClothBodySpacingWidth, 0); body.CreateFixture(boxFix); if (y == 0) { WeldJointDef wjd = new WeldJointDef(); wjd.Initialize(body, bar, body.WorldCenter); m_world.CreateJoint(wjd); } cloth[x, y] = body; } boxBod.Position = new Vec2(-ClothTotalWidth / 2, boxBod.Position.Y - ClothBodySpacingWidth); } for (int y = 0; y < ClothSegmentsHeight; ++y) { for (int x = 0; x < ClothSegmentsWidth; ++x) { Body leftBody, rightBody; DistanceJointDef djd = new DistanceJointDef(); djd.FrequencyHz = 15 + Rand.RandomFloat(0, 6); djd.DampingRatio = 0.11f + Rand.RandomFloat(0.01f, 0.15f); // connect to right if (x != ClothSegmentsWidth - 1) { leftBody = cloth[x, y]; rightBody = cloth[x + 1, y]; djd.Initialize(leftBody, rightBody, leftBody.WorldCenter, rightBody.WorldCenter); m_world.CreateJoint(djd); } // connect to up if (y != 0) { leftBody = cloth[x, y]; rightBody = cloth[x, y - 1]; djd.Initialize(leftBody, rightBody, leftBody.WorldCenter, rightBody.WorldCenter); m_world.CreateJoint(djd); } } } }
public Web() { Body ground = null; { BodyDef bd = new BodyDef(); ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.5f); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(-5.0f, 5.0f); m_bodies[0] = m_world.CreateBody(bd); m_bodies[0].CreateFixture(shape, 5.0f); bd.Position = new Vec2(5.0f, 5.0f); m_bodies[1] = m_world.CreateBody(bd); m_bodies[1].CreateFixture(shape, 5.0f); bd.Position = new Vec2(5.0f, 15.0f); m_bodies[2] = m_world.CreateBody(bd); m_bodies[2].CreateFixture(shape, 5.0f); bd.Position = new Vec2(-5.0f, 15.0f); m_bodies[3] = m_world.CreateBody(bd); m_bodies[3].CreateFixture(shape, 5.0f); DistanceJointDef jd = new DistanceJointDef(); Vec2 p1, p2, d; jd.FrequencyHz = 4.0f; jd.DampingRatio = 0.5f; jd.BodyA = ground; jd.BodyB = m_bodies[0]; jd.LocalAnchorA = new Vec2(-10.0f, 0.0f); jd.LocalAnchorB = new Vec2(-0.5f, -0.5f); p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[0] = m_world.CreateJoint(jd); jd.BodyA = ground; jd.BodyB = m_bodies[1]; jd.LocalAnchorA = new Vec2(10.0f, 0.0f); jd.LocalAnchorB = new Vec2(0.5f, -0.5f); p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[1] = m_world.CreateJoint(jd); jd.BodyA = ground; jd.BodyB = m_bodies[2]; jd.LocalAnchorA = new Vec2(10.0f, 20.0f); jd.LocalAnchorB = new Vec2(0.5f, 0.5f); p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[2] = m_world.CreateJoint(jd); jd.BodyA = ground; jd.BodyB = m_bodies[3]; jd.LocalAnchorA = new Vec2(-10.0f, 20.0f); jd.LocalAnchorB = new Vec2(-0.5f, 0.5f); p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[3] = m_world.CreateJoint(jd); jd.BodyA = m_bodies[0]; jd.BodyB = m_bodies[1]; jd.LocalAnchorA = new Vec2(0.5f, 0.0f); jd.LocalAnchorB = new Vec2(-0.5f, 0.0f);; p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[4] = m_world.CreateJoint(jd); jd.BodyA = m_bodies[1]; jd.BodyB = m_bodies[2]; jd.LocalAnchorA = new Vec2(0.0f, 0.5f); jd.LocalAnchorB = new Vec2(0.0f, -0.5f); p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[5] = m_world.CreateJoint(jd); jd.BodyA = m_bodies[2]; jd.BodyB = m_bodies[3]; jd.LocalAnchorA = new Vec2(-0.5f, 0.0f); jd.LocalAnchorB = new Vec2(0.5f, 0.0f); p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[6] = m_world.CreateJoint(jd); jd.BodyA = m_bodies[3]; jd.BodyB = m_bodies[0]; jd.LocalAnchorA = new Vec2(0.0f, -0.5f); jd.LocalAnchorB = new Vec2(0.0f, 0.5f); p1 = jd.BodyA.GetWorldPoint(jd.LocalAnchorA); p2 = jd.BodyB.GetWorldPoint(jd.LocalAnchorB); d = p2 - p1; jd.Length = d.Length(); m_joints[7] = m_world.CreateJoint(jd); } }
public ApplyForce() { m_world.Gravity = new Vec2(0.0f, 0.0f); const float k_restitution = 0.4f; Body ground; { BodyDef bd = new BodyDef(); bd.Position = new Vec2(0.0f, 20.0f); ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); FixtureDef sd = new FixtureDef(); sd.Shape = shape; sd.Density = 0.0f; sd.Restitution = k_restitution; // Left vertical shape.SetAsEdge(new Vec2(-20.0f, -20.0f), new Vec2(-20.0f, 20.0f)); ground.CreateFixture(sd); // Right vertical shape.SetAsEdge(new Vec2(20.0f, -20.0f), new Vec2(20.0f, 20.0f)); ground.CreateFixture(sd); // Top horizontal shape.SetAsEdge(new Vec2(-20.0f, 20.0f), new Vec2(20.0f, 20.0f)); ground.CreateFixture(sd); // Bottom horizontal shape.SetAsEdge(new Vec2(-20.0f, -20.0f), new Vec2(20.0f, -20.0f)); ground.CreateFixture(sd); } { Transform xf1 = new Transform(); xf1.R = new Mat22(0.3524f * (float)Math.PI); xf1.Position = (xf1.R * new Vec2(1.0f, 0.0f)); Vec2[] vertices = new Vec2[3] { (xf1 * new Vec2(-1.0f, 0.0f)), (xf1 * new Vec2(1.0f, 0.0f)), (xf1 * new Vec2(0.0f, 0.5f)) }; PolygonShape poly1 = new PolygonShape(vertices); FixtureDef sd1 = new FixtureDef(); sd1.Shape = poly1; sd1.Density = 4.0f; Transform xf2 = new Transform(); xf2.R = new Mat22(-0.3524f * (float)Math.PI); xf2.Position = (xf2.R * new Vec2(-1.0f, 0.0f)); vertices = new Vec2[] { (xf2 * new Vec2(-1.0f, 0.0f)), (xf2 * new Vec2(1.0f, 0.0f)), (xf2 * new Vec2(0.0f, 0.5f)) }; PolygonShape poly2 = new PolygonShape(vertices); FixtureDef sd2 = new FixtureDef(); sd2.Shape = poly2; sd2.Density = 2.0f; BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.AngularDamping = 5.0f; bd.LinearDamping = 0.1f; bd.Position = new Vec2(0.0f, 2.0f); bd.Angle = (float)Math.PI; bd.AllowSleep = false; m_body = m_world.CreateBody(bd); m_body.CreateFixture(sd1); m_body.CreateFixture(sd2); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.5f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 1.0f; fd.Friction = 0.3f; for (int i = 0; i < 10; ++i) { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(0.0f, 5.0f + 1.54f * i); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); float gravity = 10.0f; float I = body.Inertia; float mass = body.Mass; // For a circle: I = 0.5 * m * r * r ==> r = sqrt(2 * I / m) float radius = (float)Math.Sqrt(2.0f * I / mass); FrictionJointDef jd = new FrictionJointDef(); jd.LocalAnchorA = jd.LocalAnchorB = Vec2.Empty; jd.BodyA = ground; jd.BodyB = body; jd.CollideConnected = true; jd.MaxForce = mass * gravity; jd.MaxTorque = mass * radius * gravity; m_world.CreateJoint(jd); } } }
public void DrawJoint(Box2CS.Serialize.JointDefSerialized x, Vec2 p1, Vec2 p2, BodyDef bodyA, BodyDef bodyB) { Transform xf1 = new Transform(bodyA.Position, new Mat22(bodyA.Angle)); Transform xf2 = new Transform(bodyB.Position, new Mat22(bodyB.Angle)); Vec2 x1 = xf1.Position; Vec2 x2 = xf2.Position; p1 = xf1 * p1; p2 = xf2 * p2; ColorF color = new ColorF(0.5f, 0.8f, 0.8f); switch (x.Joint.JointType) { case JointType.Distance: DrawSegment(p1, p2, color); break; case JointType.Pulley: { PulleyJointDef pulley = (PulleyJointDef)x.Joint; Vec2 s1 = pulley.GroundAnchorA; Vec2 s2 = pulley.GroundAnchorB; DrawSegment(s1, p1, color); DrawSegment(s2, p2, color); DrawSegment(s1, s2, color); } break; case JointType.Revolute: { RevoluteJointDef rjd = (RevoluteJointDef)x.Joint; if (rjd.EnableLimit) { Vec2 startPos = p1; Vec2 sinCos = new Vec2(-(float)Math.Cos((rjd.UpperAngle + rjd.ReferenceAngle) - (float)Math.PI / 2), -(float)Math.Sin((rjd.UpperAngle + rjd.ReferenceAngle) - (float)Math.PI / 2)); var end = startPos + (sinCos * 3); DrawSegment(startPos, end, new ColorF(0, 0.65f, 0.65f)); sinCos = new Vec2(-(float)Math.Cos((rjd.LowerAngle + rjd.ReferenceAngle) - (float)Math.PI / 2), -(float)Math.Sin((rjd.LowerAngle + rjd.ReferenceAngle) - (float)Math.PI / 2)); end = startPos + (sinCos * 3); DrawSegment(startPos, end, new ColorF(0, 0.65f, 0.65f)); DrawArc(startPos, 3, (-rjd.LowerAngle - rjd.ReferenceAngle), (-rjd.UpperAngle - rjd.ReferenceAngle)); } DrawCircle(p1, 0.75f, new ColorF(0, 0.65f, 0.65f)); DrawSegment(x1, p1, color); DrawSegment(p1, p2, color); DrawSegment(x2, p2, color); } break; default: case JointType.Unknown: DrawSegment(x1, p1, color); DrawSegment(p1, p2, color); DrawSegment(x2, p2, color); break; } }
public CharacterCollision() { // Ground body { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } // Collinear edges { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-8.0f, 1.0f), new Vec2(-6.0f, 1.0f)); ground.CreateFixture(shape, 0.0f); shape.SetAsEdge(new Vec2(-6.0f, 1.0f), new Vec2(-4.0f, 1.0f)); ground.CreateFixture(shape, 0.0f); shape.SetAsEdge(new Vec2(-4.0f, 1.0f), new Vec2(-2.0f, 1.0f)); ground.CreateFixture(shape, 0.0f); } // Square tiles { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsBox(1.0f, 1.0f, new Vec2(4.0f, 3.0f), 0.0f); ground.CreateFixture(shape, 0.0f); shape.SetAsBox(1.0f, 1.0f, new Vec2(6.0f, 3.0f), 0.0f); ground.CreateFixture(shape, 0.0f); shape.SetAsBox(1.0f, 1.0f, new Vec2(8.0f, 3.0f), 0.0f); ground.CreateFixture(shape, 0.0f); } // Square made from edges notice how the edges are shrunk to account // for the polygon radius. This makes it so the square character does // not get snagged. However, ray casts can now go through the cracks. { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); float d = 2.0f * Box2DSettings.b2_polygonRadius; shape.SetAsEdge(new Vec2(-1.0f + d, 3.0f), new Vec2(1.0f - d, 3.0f)); ground.CreateFixture(shape, 0.0f); shape.SetAsEdge(new Vec2(1.0f, 3.0f + d), new Vec2(1.0f, 5.0f - d)); ground.CreateFixture(shape, 0.0f); shape.SetAsEdge(new Vec2(1.0f - d, 5.0f), new Vec2(-1.0f + d, 5.0f)); ground.CreateFixture(shape, 0.0f); shape.SetAsEdge(new Vec2(-1.0f, 5.0f - d), new Vec2(-1.0f, 3.0f + d)); ground.CreateFixture(shape, 0.0f); } // Square character { BodyDef bd = new BodyDef(); bd.Position = new Vec2(-3.0f, 5.0f); bd.BodyType = BodyType.Dynamic; bd.FixedRotation = true; bd.AllowSleep = false; Body body = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.5f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 20.0f; body.CreateFixture(fd); } // Hexagon character { BodyDef bd = new BodyDef(); bd.Position = new Vec2(-5.0f, 5.0f); bd.BodyType = BodyType.Dynamic; bd.FixedRotation = true; bd.AllowSleep = false; Body body = m_world.CreateBody(bd); float angle = 0.0f; float delta = (float)Math.PI / 3.0f; Vec2[] vertices = new Vec2[6]; for (int i = 0; i < 6; ++i) { vertices[i] = new Vec2(0.5f * (float)Math.Cos(angle), 0.5f * (float)Math.Sin(angle)); angle += delta; } PolygonShape shape = new PolygonShape(); shape.Vertices = vertices; FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 20.0f; body.CreateFixture(fd); } // Circle character { BodyDef bd = new BodyDef(); bd.Position = new Vec2(3.0f, 5.0f); bd.BodyType = BodyType.Dynamic; bd.FixedRotation = true; bd.AllowSleep = false; Body body = m_world.CreateBody(bd); CircleShape shape = new CircleShape(); shape.Radius = 0.5f; FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 20.0f; body.CreateFixture(fd); } }
void Create(int index) { if (m_bodies[m_bodyIndex] != null) { m_world.DestroyBody(m_bodies[m_bodyIndex]); m_bodies[m_bodyIndex] = null; } BodyDef bd = new BodyDef(); float x = Rand.RandomFloat(-10.0f, 10.0f); float y = Rand.RandomFloat(0.0f, 20.0f); bd.Position = new Vec2(x, y); bd.Angle = Rand.RandomFloat((float)-Math.PI, (float)Math.PI); bd.UserData = index; if (index == 4) bd.AngularDamping = 0.02f; m_bodies[m_bodyIndex] = m_world.CreateBody(bd); if (index < 4) { FixtureDef fd = new FixtureDef(); fd.Shape = m_polygons[index]; fd.Friction = 0.3f; m_bodies[m_bodyIndex].CreateFixture(fd); } else { FixtureDef fd = new FixtureDef(); fd.Shape = m_circle; fd.Friction = 0.3f; m_bodies[m_bodyIndex].CreateFixture(fd); } m_bodyIndex = (m_bodyIndex + 1) % e_maxBodies; }
public CollisionFiltering() { // Ground body { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); FixtureDef sd = new FixtureDef(); sd.Shape = shape; sd.Friction = 0.3f; BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); ground.CreateFixture(sd); } // Small triangle Vec2[] vertices = new Vec2[3]; vertices[0] = new Vec2(-1.0f, 0.0f); vertices[1] = new Vec2(1.0f, 0.0f); vertices[2] = new Vec2(0.0f, 2.0f); PolygonShape polygon = new PolygonShape(vertices); FixtureDef triangleShapeDef = new FixtureDef(); triangleShapeDef.Shape = polygon; triangleShapeDef.Density = 1.0f; triangleShapeDef.Filter = new FilterData(k_triangleCategory, k_triangleMask, k_smallGroup); BodyDef triangleBodyDef = new BodyDef(); triangleBodyDef.BodyType = BodyType.Dynamic; triangleBodyDef.Position = new Vec2(-5.0f, 2.0f); Body body1 = m_world.CreateBody(triangleBodyDef); body1.CreateFixture(triangleShapeDef); // Large triangle (recycle definitions) vertices[0] *= 2.0f; vertices[1] *= 2.0f; vertices[2] *= 2.0f; polygon.Vertices = vertices; triangleShapeDef.Filter = new FilterData(triangleShapeDef.Filter.CategoryBits, triangleShapeDef.Filter.MaskBits, k_largeGroup); triangleBodyDef.Position = new Vec2(-5.0f, 6.0f); triangleBodyDef.FixedRotation = true; // look at me! Body body2 = m_world.CreateBody(triangleBodyDef); body2.CreateFixture(triangleShapeDef); { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(-5.0f, 10.0f); Body body = m_world.CreateBody(bd); PolygonShape p = new PolygonShape(); p.SetAsBox(0.5f, 1.0f); body.CreateFixture(p, 1.0f); PrismaticJointDef jd = new PrismaticJointDef(); jd.BodyA = body2; jd.BodyB = body; jd.EnableLimit = true; jd.LocalAnchorA = new Vec2(0.0f, 4.0f); jd.LocalAnchorB = Vec2.Empty; jd.LocalAxis = new Vec2(0.0f, 1.0f); jd.LowerTranslation = -1.0f; jd.UpperTranslation = 1.0f; m_world.CreateJoint(jd); } // Small box polygon.SetAsBox(1.0f, 0.5f); FixtureDef boxShapeDef = new FixtureDef(); boxShapeDef.Shape = polygon; boxShapeDef.Density = 1.0f; boxShapeDef.Restitution = 0.1f; boxShapeDef.Filter = new FilterData(k_boxCategory, k_boxMask, k_smallGroup); BodyDef boxBodyDef = new BodyDef(); boxBodyDef.BodyType = BodyType.Dynamic; boxBodyDef.Position = new Vec2(0.0f, 2.0f); Body body3 = m_world.CreateBody(boxBodyDef); body3.CreateFixture(boxShapeDef); // Large box (recycle definitions) polygon.SetAsBox(2.0f, 1.0f); boxShapeDef.Filter = new FilterData(k_boxCategory, k_boxMask, k_largeGroup); boxBodyDef.Position = new Vec2(0.0f, 6.0f); Body body4 = m_world.CreateBody(boxBodyDef); body4.CreateFixture(boxShapeDef); // Small circle CircleShape circle = new CircleShape(); circle.Radius = 1.0f; FixtureDef circleShapeDef = new FixtureDef(); circleShapeDef.Shape = circle; circleShapeDef.Density = 1.0f; circleShapeDef.Filter = new FilterData(k_circleCategory, k_circleMask, k_smallGroup); BodyDef circleBodyDef = new BodyDef(); circleBodyDef.BodyType = BodyType.Dynamic; circleBodyDef.Position = new Vec2(5.0f, 2.0f); Body body5 = m_world.CreateBody(circleBodyDef); body5.CreateFixture(circleShapeDef); // Large circle circle.Radius *= 2.0f; circleShapeDef.Filter = new FilterData(k_circleCategory, k_circleMask, k_largeGroup); circleBodyDef.Position = new Vec2(5.0f, 6.0f); Body body6 = m_world.CreateBody(circleBodyDef); body6.CreateFixture(circleShapeDef); }
public RayCast() { // Ground body { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { Vec2[] vertices = new Vec2[3]; vertices[0] = new Vec2(-0.5f, 0.0f); vertices[1] = new Vec2(0.5f, 0.0f); vertices[2] = new Vec2(0.0f, 1.5f); m_polygons[0] = new PolygonShape(); m_polygons[0].Vertices = vertices; } { Vec2[] vertices = new Vec2[3]; vertices[0] = new Vec2(-0.1f, 0.0f); vertices[1] = new Vec2(0.1f, 0.0f); vertices[2] = new Vec2(0.0f, 1.5f); m_polygons[1] = new PolygonShape(); m_polygons[1].Vertices = vertices; } { float w = 1.0f; float b = w / (2.0f + (float)Math.Sqrt(2.0f)); float s = (float)Math.Sqrt(2.0f) * b; Vec2[] vertices = new Vec2[8]; vertices[0] = new Vec2(0.5f * s, 0.0f); vertices[1] = new Vec2(0.5f * w, b); vertices[2] = new Vec2(0.5f * w, b + s); vertices[3] = new Vec2(0.5f * s, w); vertices[4] = new Vec2(-0.5f * s, w); vertices[5] = new Vec2(-0.5f * w, b + s); vertices[6] = new Vec2(-0.5f * w, b); vertices[7] = new Vec2(-0.5f * s, 0.0f); m_polygons[2] = new PolygonShape(); m_polygons[2].Vertices = vertices; } { m_polygons[3] = new PolygonShape(); m_polygons[3].SetAsBox(0.5f, 0.5f); } { m_circle = new CircleShape(); m_circle.Radius = 0.5f; } m_bodyIndex = 0; m_angle = 0.0f; m_mode = Mode.e_closest; }
public Pyramid() { { BodyDef bd = new BodyDef(); { Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); { shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } } } { float a = 0.5f; PolygonShape shape = new PolygonShape(); { shape.SetAsBox(a, a); Vec2 x = new Vec2(-7.0f, 0.75f), y; Vec2 deltaX = new Vec2(0.5625f, 1.25f); Vec2 deltaY = new Vec2(1.125f, 0.0f); BodyDef bd = new BodyDef(); { for (int i = 0; i < e_count; ++i) { y = x; for (int j = i; j < e_count; ++j) { bd.BodyType = BodyType.Dynamic; bd.Position = y; Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 5.0f); body.UserData = totalCount; totalCount++; m_bodies.Add(body); y += deltaY; } x += deltaX; } m_touching = new bool[totalCount]; } } } { Body movableBody = m_world.CreateBody(new BodyDef()); movableBody.Position = new Vec2(999, 999); CircleShape shape = new CircleShape(); shape.Radius = 7.0f; shape.Position = new Vec2(0, 0); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.IsSensor = true; m_sensor = movableBody.CreateFixture(fd); } }