private void CreateGroundAndWalls() { var grounDef = new BodyDef(); grounDef.type = BodyType.Static; var groundFix = new FixtureDef(); groundFix.restitution = 1.0f; groundFix.friction = 0.0f; groundFix.density = 0.0f; var groundShape = new PolygonShape(); groundShape.SetAsEdge(new Vector2(0, 8), new Vector2(4.8f, 8.0f)); var groundBody = world.CreateBody(grounDef); groundFix.shape = groundShape; groundBody.CreateFixture(groundFix); groundShape.SetAsEdge(new Vector2(0, 0), new Vector2(0f, 8.0f)); var leftBody = world.CreateBody(grounDef); groundFix.shape = groundShape; leftBody.CreateFixture(groundFix); groundShape.SetAsEdge(new Vector2(4.8f, 0), new Vector2(4.8f, 8.0f)); var rightBody = world.CreateBody(grounDef); groundFix.shape = groundShape; rightBody.CreateFixture(groundFix); groundShape.SetAsEdge(new Vector2(0, 0), new Vector2(4.8f, 0)); var topBody = world.CreateBody(grounDef); groundFix.shape = groundShape; topBody.CreateFixture(groundFix); }
public void LaunchBomb(Vector2 position, Vector2 velocity) { if (Bomb != default) { World.DestroyBody(Bomb); Bomb = default; } var bd = new BodyDef { BodyType = BodyType.DynamicBody, Position = position, Bullet = true }; Bomb = World.CreateBody(bd); Bomb.SetLinearVelocity(velocity); var circle = new CircleShape { Radius = 0.3f }; var fd = new FixtureDef { Shape = circle, Density = 20.0f, Restitution = 0.0f }; Bomb.CreateFixture(fd); }
private void AddBallBody(Vector2 position, Texture2D ballSprite) { //Ball body definition BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = position; //Add circle shaped fixture to ball body var circle = new CircleShape(); circle._radius = 26; var fd = new FixtureDef(); fd.shape = circle; fd.restitution = 1.0f; fd.friction = 0.0f; fd.density = 1.0f; ballBody = physicsWorld.CreateBody(bd); ballBody.CreateFixture(fd); //Attach ball sprite reference to ball body ballBody.SetUserData(ballSprite); ballBody.SetLinearVelocity(new Vector2(50000000.0f, 100000000.0f)); }
public static void Separate(Body body, FixtureDef fixtureDef, Vector2[] vertices) { const float scale = 30; int i; var n = vertices.Length; var vec = new List <Vector2>(); for (i = 0; i < n; i++) { vec.Add(new Vector2(vertices[i].X * scale, vertices[i].Y * scale)); } var figsVec = CalcShapes(vec); n = figsVec.Count; for (i = 0; i < n; i++) { vec = figsVec[i]; vertices = new Vector2[vec.Count]; var m = vec.Count; int j; for (j = 0; j < m; j++) { vertices[j] = new Vector2(vec[j].X / scale, vec[j].Y / scale); } var polyShape = new PolygonShape(); polyShape.Set(vertices); fixtureDef.Shape = polyShape; body.CreateFixture(fixtureDef); } }
public Body CreateWall(World world, float ScaleFactor) { var grounDef = new BodyDef(); grounDef.type = BodyType.Static; var groundFix = new FixtureDef(); groundFix.restitution = 1.0f; groundFix.friction = 0.0f; groundFix.density = 0.0f; var groundShape = new PolygonShape(); //groundShape.SetAsEdge(new Vector2(0, 8), new Vector2(4.8f, 8.0f)); groundShape.SetAsBox(texture.Width * ScaleFactor / 2f, texture.Height * ScaleFactor / 2f); var groundBody = world.CreateBody(grounDef); groundBody.Position = new Vector2(2.4f, 4); groundFix.shape = groundShape; groundBody.CreateFixture(groundFix); return(groundBody); }
public PhysicsCircle(Texture2D sprite_texture, World physicsWorld, float radius, float positionX, float positionY, float rotation, float density) : base(sprite_texture) { this.scaleToFitTheseDimensions(radius * 2.0f, radius * 2.0f); this.position.X = positionX; this.position.Y = positionY; this.rotation = rotation; BodyDef dynamicBodyDef = new BodyDef(); dynamicBodyDef.type = BodyType.Dynamic; dynamicBodyDef.position = new Vector2(positionX / ScreenPixelsPerMeter, positionY / ScreenPixelsPerMeter); dynamicBodyDef.linearDamping = 0.0f; Body dynamicBody = physicsWorld.CreateBody(dynamicBodyDef); CircleShape dynamicCircleShape = new CircleShape(); dynamicCircleShape._radius = radius / DynamicPhysicsGameObject.ScreenPixelsPerMeter; //dynamicBoxShape. //dynamicBoxShape.SetAsBox(box_width / 2.0f, box_height / 2.0f); //experiment with / 2.0f FixtureDef dynamicCircleFixtureDef = new FixtureDef(); dynamicCircleFixtureDef.shape = dynamicCircleShape; dynamicCircleFixtureDef.density = density; dynamicCircleFixtureDef.friction = 0.3f; dynamicBody.CreateFixture(dynamicCircleFixtureDef); this.physicsBody = dynamicBody; }
public IPhysicsBody CreateCannonBall(int x, int y, double angle, double velocity, ICollider cannonBall) { var vx = Math.Cos((angle) * Math.PI / 180) * velocity; var vy = Math.Sin((angle) * Math.PI / 180) * velocity; var offvx = Math.Cos((angle) * Math.PI / 180) * 4d * 16d; var offvy = Math.Sin((angle) * Math.PI / 180) * 3d * 16d; var fixDef = new FixtureDef(); fixDef.density = 1; fixDef.friction = 1; fixDef.restitution = .6; var bodyDef = new BodyDef(); bodyDef.type = BodyType.DYNAMIC; bodyDef.position.x = this.PixelToMeter(x + offvx); bodyDef.position.y = this.PixelToMeter(y + offvy); var circleShape = new CircleShape(); circleShape.m_radius = 1.25d / 2d; fixDef.shape = circleShape; var body = this.World.createBody(bodyDef); var fixture = body.createFixture(fixDef); body.setUserData(cannonBall); body.applyLinearImpulse(new Vec2(vx, vy), body.getWorldCenter()); return(new PhysicsBody(body)); }
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); } } }
protected override void OnKeyDown(KeyEventArgs e) { if (e.KeyCode == Keys.OemComma) { if (_bullet != null) { _world.DestroyBody(_bullet); _bullet = null; } { CircleShape shape = new CircleShape(); shape._radius = 0.25f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; fd.restitution = 0.05f; BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.bullet = true; bd.position = new Vector2(-31.0f, 5.0f); _bullet = _world.CreateBody(bd); _bullet.CreateFixture(fd); _bullet.SetLinearVelocity(new Vector2(400.0f, 0.0f)); } } }
protected Body CreateBox(float x, float y, float w, float h) { x /= WorldScale; y /= WorldScale; w /= WorldScale; h /= WorldScale; BodyDef bodyDef = new BodyDef(); bodyDef.position = new Vector2(x + w / 2f, y + h / 2f); bodyDef.type = BodyType.Static; Body body = world.CreateBody(bodyDef); PolygonShape polyShape = new PolygonShape(); polyShape.SetAsBox(w / 2f, h / 2f); //polyShape._vertexCount = 4; //polyShape._vertices[0] = new Vector2(0, 0); //polyShape._vertices[1] = new Vector2(w, 0); //polyShape._vertices[2] = new Vector2(w, h); //polyShape._vertices[3] = new Vector2(0, h); FixtureDef fd = new FixtureDef(); fd.density = 1; fd.shape = polyShape; fd.filter.groupIndex = 1; fd.filter.categoryBits = 1; fd.filter.maskBits = 0xFFFF; Fixture f = body.CreateFixture(fd); return(body); }
public void DrawShape(FixtureDef fixture, Transform xf, ColorF color) { switch (fixture.Shape.ShapeType) { case ShapeType.Circle: { CircleShape circle = (CircleShape)fixture.Shape; Vec2 center = (xf * circle.Position); float radius = circle.Radius; Vec2 axis = xf.R.Col1; DrawSolidCircle(center, radius, axis, color); } break; case ShapeType.Polygon: { PolygonShape poly = (PolygonShape)fixture.Shape; int vertexCount = poly.VertexCount; //b2Assert(vertexCount <= b2_maxPolygonVertices); for (int i = 0; i < vertexCount; ++i) { drawVertices[i] = (xf * poly.Vertices[i]); } DrawSolidPolygon(drawVertices, vertexCount, color); } break; } }
// потом заменить на загрузку из storage public Chip(GameWorld gameWorld, Vector2 Pos, float radius, float density, float friction, float restitution, Texture2D texture, SoundEffect hitSound) : this(gameWorld.ScreenManager.Game) { this.gameWorld = gameWorld; this.spriteBatch = gameWorld.ScreenManager.SpriteBatch; this.world = gameWorld.physWorld; this.texture = texture; this.hitSound = hitSound; BodyDef BodyDef; FixtureDef FixtureDef; Body B; BodyDef = new BodyDef(); FixtureDef = new FixtureDef(); BodyDef.type = BodyType.Dynamic; BodyDef.position = Pos; B = world.CreateBody(BodyDef); CircleShape dynamicCircle = new CircleShape(); dynamicCircle._radius = radius; FixtureDef.shape = dynamicCircle; FixtureDef.density = density; FixtureDef.friction = friction; FixtureDef.restitution = restitution; fixture = B.CreateFixture(FixtureDef); textureCenter.X = (float)texture.Width / 2.0f; textureCenter.Y = (float)texture.Height / 2.0f; }
/// <inheritdoc /> /// <inheritdoc /> public override void OnKeyDown(KeyInputEventArgs keyInput) { if (keyInput.Key == KeyCodes.F) { if (_bullet != null) { World.DestroyBody(_bullet); _bullet = null; } { var shape = new CircleShape { Radius = 0.25f }; var fd = new FixtureDef { Shape = shape, Density = 20.0f, Restitution = 0.05f }; var bd = new BodyDef { BodyType = BodyType.DynamicBody, Bullet = true, Position = new Vector2(-31.0f, 5.0f) }; _bullet = World.CreateBody(bd); _bullet.CreateFixture(fd); _bullet.SetLinearVelocity(new Vector2(400.0f, 0.0f)); } } }
public VaryingRestitution() { { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); EdgeShape shape = new EdgeShape(); shape.Set(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); shape.Density = 0; ground.CreateFixture(shape); } { CircleShape shape = new CircleShape(); shape.m_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.type = BodyType._dynamicBody; bd.Position.Set(-10.0f + 3.0f * i, 20.0f); Body body = m_world.CreateBody(bd); fd.restitution = restitution[i]; body.CreateFixture(fd); } } }
public void ApplyAttribtues(FixtureDef def) { if (friction != 0.2f) { def.friction = friction; } if (restitution != 0) { def.restitution = restitution; } if (density != 0) { def.density = density; } if (categoryBits != 0x0001) { def.filter.categoryBits = categoryBits; } if (maskBits != 0xFFFF) { def.filter.maskBits = maskBits; } if (groupIndex != 0) { def.filter.groupIndex = groupIndex; } if (isSensor != false) { def.isSensor = isSensor; } }
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; } }
VaryingRestitution() { { BodyDef bd = new BodyDef(); Body ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(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 = new float[7] {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.type = BodyType.Dynamic; bd.position = new Vector2(-10.0f + 3.0f * i, 20.0f); Body body = _world.CreateBody(bd); fd.restitution = restitution[i]; body.CreateFixture(fd); } } }
public LightSource(ComatoseGame gm) : base(gm) { //body.SetActive(false); buffer = new VertexBuffer(game.GraphicsDevice, typeof(VertexPositionColor), _max_rays * 3, BufferUsage.None); light_shader = new BasicEffect(game.GraphicsDevice); light_shader.Projection = Matrix.CreateOrthographicOffCenter(0, 128, 72, 0, 1, -1); light_shader.VertexColorEnabled = true; //add a dummy physics object to the light, to allow it to do things body.SetType(BodyType.Dynamic); FixtureDef fdef = new FixtureDef(); fdef.density = 0.1f; fdef.friction = 0.0f; CircleShape circle = new CircleShape(); circle._p = new Vector2(0); circle._radius = (float)0.1f; fdef.shape = circle; fixture = body.CreateFixture(fdef); body.ResetMassData(); layer = "light"; }
protected override void Create() { { var bd = new BodyDef(); var ground = World.CreateBody(bd); var shape = new EdgeShape(); shape.Set(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { var shape = new CircleShape(); shape.Radius = 1.0f; var 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 (var i = 0; i < 7; ++i) { var bd = new BodyDef(); bd.BodyType = BodyType.DynamicBody; bd.Position.Set(-10.0f + 3.0f * i, 20.0f); var body = World.CreateBody(bd); fd.Restitution = restitution[i]; body.CreateFixture(fd); } } }
internal Fixture(FixtureDef def) { _userData = def.UserData; _friction = def.Friction; _restitution = def.Restitution; _restitutionThreshold = def.RestitutionThreshold; _collisionGroup = def.Filter.Group; _collisionCategories = def.Filter.Category; _collidesWith = def.Filter.CategoryMask; //Velcro: we have support for ignoring CCD with certain groups _ignoreCcdWith = Settings.DefaultFixtureIgnoreCCDWith; _isSensor = def.IsSensor; _shape = def.Shape.Clone(); // Reserve proxy space int childCount = Shape.ChildCount; _proxies = new FixtureProxy[childCount]; for (int i = 0; i < childCount; ++i) { _proxies[i].Fixture = null; _proxies[i].ProxyId = DynamicTreeBroadPhase.NullProxy; } _proxyCount = 0; //TODO: //m_density = def->density; }
public Body CreateBall(World world, float ScaleFactor) { var bodyDef = new BodyDef(); bodyDef.type = BodyType.Dynamic; var ballShape = new CircleShape(); ballShape._radius = (texture.Width / 2f) * ScaleFactor; var ballFixture = new FixtureDef(); ballFixture.friction = 0.0f; // no friction ballFixture.restitution = 1.0f; // give the ball a perfect bounce ballFixture.density = 1.0f; ballFixture.shape = ballShape; var ballBody = world.CreateBody(bodyDef); ballBody.CreateFixture(ballFixture); // ballBody.Position = new Vector2(((float)r.NextDouble() * 4.5f + .3f), (float)r.NextDouble() * 4.5f + .3f); //ballBodies.Add(ballBody); return(ballBody); }
/// <summary> /// Initializes a new instance of the <see cref="Fixture" /> class /// </summary> /// <param name="def">The def</param> internal Fixture(FixtureDef def) { userData = def.UserData; Frictionprivate = def.Friction; Restitutionprivate = def.Restitution; RestitutionThresholdPrivate = def.RestitutionThreshold; CollisionGroupPrivate = def.Filter.Group; CollisionCategoriesprivate = def.Filter.Category; CollidesWithprivate = def.Filter.CategoryMask; //Velcro: we have support for ignoring CCD with certain groups ignoreCcdWith = Settings.DefaultFixtureIgnoreCcdWith; IsSensorPrivate = def.IsSensor; ShapePrivate = def.Shape.Clone(); // Reserve proxy space int childCount = Shape.ChildCount; proxies = new FixtureProxy[childCount]; for (int i = 0; i < childCount; ++i) { proxies[i].Fixture = null; proxies[i].ProxyId = DynamicTreeBroadPhase.NullProxy; } proxyCount = 0; //TODO: //m_density = def->density; }
public override void Keyboard(KeyboardState state, KeyboardState oldState) { if (state.IsKeyDown(Keys.OemComma) && oldState.IsKeyUp(Keys.OemComma)) { if (_bullet != null) { _world.DestroyBody(_bullet); _bullet = null; } { CircleShape shape = new CircleShape(); shape._radius = 0.25f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; fd.restitution = 0.05f; BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.bullet = true; bd.position = new Vector2(-31.0f, 5.0f); _bullet = _world.CreateBody(bd); _bullet.CreateFixture(fd); _bullet.SetLinearVelocity(new Vector2(400.0f, 0.0f)); } } }
protected void AddPoly(Body body2Body, V2DShape polygon) { Shape shape; if (polygon.IsCircle) { CircleShape circDef = new CircleShape(); circDef._radius = polygon.Radius / (V2DScreen.WorldScale * State.Scale.X); Vector2 lp = new Vector2(polygon.CenterX / V2DScreen.WorldScale, polygon.CenterY / V2DScreen.WorldScale); circDef._p = lp; shape = circDef; } else { float[] pts = polygon.Data; PolygonShape polyDef = new PolygonShape(); shape = polyDef; int len = (int)(pts.Length / 2); Vector2[] v2s = new Vector2[len]; for (int i = 0; i < len; i++) { float px = pts[i * 2]; float py = pts[i * 2 + 1]; v2s[i] = new Vector2( px / V2DScreen.WorldScale * State.Scale.X, py / V2DScreen.WorldScale * State.Scale.Y); } polyDef.Set(v2s, len); } FixtureDef fd = new FixtureDef(); fd.shape = shape; if (instanceName.IndexOf("s_") == 0) { isStatic = true; fd.density = 0.0f; } else { fd.density = density; } fd.friction = friction; fd.restitution = restitution; if (groupIndex != 0) { fd.filter.groupIndex = groupIndex; } if (attributeProperties != null) { attributeProperties.ApplyAttribtues(fd); } body.CreateFixture(fd); }
void addPolygon(Vector2 pos, int radius, int count) { int circleSteps = count; Vector2[] circleList = new Vector2[circleSteps]; var circleRadius = radius; for (int i = 0; i < circleSteps; i++) { circleList[i] = new Vector2((float)(circleRadius * Math.Cos(2 * Math.PI / circleSteps * i)), (float)(circleRadius * Math.Sin(2 * Math.PI / circleSteps * i))); } var circleBody = new BodyDef(); circleBody.type = BodyType.Dynamic; circleBody.position = pos; var circleShape = new PolygonShape(); circleShape.Set(circleList, circleSteps); var circleFixture = new FixtureDef(); circleFixture.shape = circleShape; circleFixture.density = 1; Body worldCircle = physicsWorld.CreateBody(circleBody); worldCircle.CreateFixture(circleFixture); }
private void createSlice(Vector2[] vertices, int numVertices) { Vector2 centre = findCentroid(vertices, vertices.Length); for (int i = 0; i < numVertices; i++) { vertices[i] -= centre; } var sliceBody = new BodyDef(); sliceBody.position = centre; sliceBody.type = BodyType.Dynamic; var slicePoly = new PolygonShape(); if (2 <= numVertices && numVertices <= Settings.b2_maxPolygonVertices) { slicePoly.Set(vertices, numVertices); } var sliceFixture = new FixtureDef(); sliceFixture.shape = slicePoly; sliceFixture.density = 1; Body worldSlice = physicsWorld.CreateBody(sliceBody); worldSlice.CreateFixture(sliceFixture); for (int i = 0; i < numVertices; i++) { vertices[i] += centre; } }
private void LoadShip() { Vector2 position = new Vector2(Width * TileWidth / 2, Height * TileHeight - 600 + FrontClearance); Texture2D texture = GameContent.ship; BodyDef bd = new BodyDef(); bd.fixedRotation = true; bd.type = BodyType.Dynamic; bd.linearDamping = 0.5f; bd.angularDamping = 0.1f; bd.position = position; ship = world.CreateBody(bd); ship.SetUserData(texture); PolygonShape pShape = new PolygonShape(); Vector2[] vertices = new Vector2[3]; vertices[0] = new Vector2(0, -texture.Height / 2); vertices[1] = new Vector2(texture.Width / 2, texture.Height / 2); vertices[2] = new Vector2(-texture.Width / 2, texture.Height / 2); pShape.Set(vertices, 3); FixtureDef fd = new FixtureDef(); fd.density = 0.1f; fd.shape = pShape; fd.friction = 5; fd.restitution = .5f; ship.CreateFixture(fd); originalShipPos = ship.Position; }
public PhysicsBox(Texture2D sprite_texture, World physicsWorld, float box_width, float box_height, float positionX, float positionY, float rot, float density) : base(sprite_texture) { this.scaleToFitTheseDimensions(box_width, box_height); this.position.X = positionX; this.position.Y = positionY; BodyDef dynamicBodyDef = new BodyDef(); dynamicBodyDef.type = BodyType.Dynamic; dynamicBodyDef.position = new Vector2(positionX / DynamicPhysicsGameObject.ScreenPixelsPerMeter, positionY / DynamicPhysicsGameObject.ScreenPixelsPerMeter); dynamicBodyDef.angle = rot; Body dynamicBody = physicsWorld.CreateBody(dynamicBodyDef); PolygonShape dynamicBoxShape = new PolygonShape(); dynamicBoxShape.SetAsBox((box_width / ScreenPixelsPerMeter) / 2.0f, (box_height / ScreenPixelsPerMeter) / 2.0f); //experiment with / 2.0f FixtureDef dynamicBoxFixtureDef = new FixtureDef(); dynamicBoxFixtureDef.shape = dynamicBoxShape; dynamicBoxFixtureDef.density = density; dynamicBoxFixtureDef.friction = 0.3f; dynamicBody.CreateFixture(dynamicBoxFixtureDef); this.physicsBody = dynamicBody; }
/// <inheritdoc /> protected override void PreUpdate() { if (Input.GetKeyDown(KeyCode.F)) { if (_bullet != null) { World.DestroyBody(_bullet); _bullet = null; } { var shape = new CircleShape { Radius = 0.25f }; var fd = new FixtureDef { Shape = shape, Density = 20.0f, Restitution = 0.05f }; var bd = new BodyDef { BodyType = BodyType.DynamicBody, Bullet = true, Position = new Vector2(-31.0f, 5.0f) }; _bullet = World.CreateBody(bd); _bullet.CreateFixture(fd); _bullet.SetLinearVelocity(new Vector2(400.0f, 0.0f)); } } }
public override void Keyboard(KeyboardManager keyboard) { if (keyboard.IsNewKeyPress(Keys.OemComma)) { if (_bullet != null) { World.RemoveBody(_bullet); _bullet = null; } { CircleShape shape = new CircleShape(0.25f, 20); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Restitution = 0.05f; BodyDef bd = new BodyDef(); bd.Type = BodyType.Dynamic; bd.IsBullet = true; bd.Position = new Vector2(-31.0f, 5.0f); _bullet = BodyFactory.CreateFromDef(World, bd); _bullet.AddFixture(fd); _bullet.LinearVelocity = new Vector2(400.0f, 0.0f); } } base.Keyboard(keyboard); }
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); } } }
/// <summary> /// 创建一个梯形物体 /// </summary> /// <param name="x">坐标 X</param> /// <param name="y">坐标 Y</param> /// <param name="top">上底</param> /// <param name="bottom">下底</param> /// <param name="height">高</param> /// <param name="bodyType">物体类型,默认是DynamicBody</param> /// <returns></returns> public Body CreateTrapezoidBody(float x, float y, float top, float bottom, float height, BodyType bodyType = BodyType.DynamicBody, bool isSensor = false) { var bodyDef = CreateBodyDef(x, y, bodyType); var body = world.CreateBody(bodyDef); var bodyShape = new PolygonShape(); var vertices = new Vector2[4]; vertices[0].Set(-top / 2, height / 2); vertices[1].Set(top / 2, height / 2); vertices[2].Set(bottom / 2, -height / 2); vertices[3].Set(-bottom / 2, -height / 2); bodyShape.Set(vertices); var fixtureDef = new FixtureDef { Shape = bodyShape, Density = 1.0f, Friction = 0.3f, IsSensor = isSensor }; body.CreateFixture(fixtureDef); return(body); }
VerticalStack() { { BodyDef bd = new BodyDef(); Body ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); shape.SetAsEdge(new Vector2(20.0f, 0.0f), new Vector2(20.0f, 20.0f)); ground.CreateFixture(shape, 0.0f); } float[] xs = new float[5] {0.0f, -10.0f, -5.0f, 5.0f, 10.0f}; for (int j = 0; j < (int)StackOptions.e_columnCount; ++j) { 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 < (int)StackOptions.e_rowCount; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; int n = j * e_rowCount + i; Debug.Assert(n < e_rowCount * e_columnCount); _indices[n] = n; bd.userData = _indices[n]; float x = 0.0f; //float x = Rand.RandomFloat-0.02f, 0.02f); //float x = i % 2 == 0 ? -0.025f : 0.025f; bd.position = new Vector2(xs[j] + x, 0.752f + 1.54f * i); Body body = _world.CreateBody(bd); _bodies[n] = body; body.CreateFixture(fd); } } _bullet = null; }
public SensorTest() { { BodyDef bd = new BodyDef(); Body ground = _world.CreateBody(bd); { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } #if false { FixtureDef sd; sd.SetAsBox(10.0f, 2.0f, new Vector2(0.0f, 20.0f), 0.0f); sd.isSensor = true; _sensor = ground.CreateFixture(&sd); } #else { CircleShape shape = new CircleShape(); shape._radius = 5.0f; shape._p = new Vector2(0.0f, 10.0f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.isSensor = true; _sensor = ground.CreateFixture(fd); } #endif } { CircleShape shape = new CircleShape(); shape._radius = 1.0f; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-10.0f + 3.0f * i, 20.0f); bd.userData = i; _touching[i] = false; _bodies[i] = _world.CreateBody(bd); _bodies[i].CreateFixture(shape, 1.0f); } } }
public Confined() { { BodyDef bd = new BodyDef(); Body ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); // Floor shape.SetAsEdge(new Vector2(-10.0f, 0.0f), new Vector2(10.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); // Left wall shape.SetAsEdge(new Vector2(-10.0f, 0.0f), new Vector2(-10.0f, 20.0f)); ground.CreateFixture(shape, 0.0f); // Right wall shape.SetAsEdge(new Vector2(10.0f, 0.0f), new Vector2(10.0f, 20.0f)); ground.CreateFixture(shape, 0.0f); // Roof shape.SetAsEdge(new Vector2(-10.0f, 20.0f), new Vector2(10.0f, 20.0f)); ground.CreateFixture(shape, 0.0f); } float radius = 0.5f; CircleShape shape2 = new CircleShape(); shape2._p = Vector2.Zero; shape2._radius = radius; FixtureDef fd = new FixtureDef(); fd.shape = shape2; fd.density = 1.0f; fd.friction = 0.1f; for (int j = 0; j < e_columnCount; ++j) { for (int i = 0; i < e_rowCount; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-10.0f + (2.1f * j + 1.0f + 0.01f * i) * radius, (2.0f * i + 1.0f) * radius); Body body = _world.CreateBody(bd); body.CreateFixture(fd); } } _world.Gravity = new Vector2(0.0f, 0.0f); }
/// 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 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); } } }
/// <summary> /// Call this to initialize a Behaviour with data supplied in a file. /// </summary> /// <param name="fileName">The file to load from.</param> public override void LoadContent(String fileName) { base.LoadContent(fileName); Int32[] input = { 1, 7, 2, 2, 3, /**/ 15, 16, 14, 16, 17 }; mMapData = new List<Int32>(input); TileMapRenderDefinition def = GameObjectManager.pInstance.pContentManager.Load<TileMapRenderDefinition>(fileName); mTexture = GameObjectManager.pInstance.pContentManager.Load<Texture2D>(def.mSpriteFileName); mSourceWidth = 16; mSourceHeight = 16; mMapCountWidth = mTexture.Width / mSourceWidth; mMapCountHeight = mTexture.Height / mSourceHeight; var shape = new PolygonShape(); shape.SetAsBox(PhysicsManager.pInstance.ScreenToPhysicalWorld(mSourceWidth / 2 * 5), PhysicsManager.pInstance.ScreenToPhysicalWorld(mSourceHeight / 2 * 2)); var fd = new FixtureDef(); fd.shape = shape; fd.restitution = 0.0f; fd.friction = 0.5f; fd.density = 0.0f; BodyDef bd = new BodyDef(); mGround = PhysicsManager.pInstance.pWorld.CreateBody(bd); mGround.CreateFixture(fd); shape.SetAsBox(PhysicsManager.pInstance.ScreenToPhysicalWorld(mSourceWidth / 2 * 5), PhysicsManager.pInstance.ScreenToPhysicalWorld(mSourceHeight / 2 * 2), PhysicsManager.pInstance.ScreenToPhysicalWorld(new Vector2(mSourceWidth * -5, 0.0f)), 0.0f); fd = new FixtureDef(); fd.shape = shape; fd.restitution = 0.0f; fd.friction = 0.5f; fd.density = 0.0f; mGround.CreateFixture(fd); }
public Chain() { Body ground = null; { BodyDef bd = new BodyDef(); ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.6f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; fd.friction = 0.2f; RevoluteJointDef jd = new RevoluteJointDef(); jd.collideConnected = false; float y = 25.0f; Body prevBody = ground; for (int i = 0; i < 30; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(0.5f + i, y); Body body = _world.CreateBody(bd); body.CreateFixture(fd); Vector2 anchor = new Vector2((float)i, y); jd.Initialize(prevBody, body, anchor); _world.CreateJoint(jd); prevBody = body; } } }
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 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)); }
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 void LaunchBomb(Vector2 position, Vector2 velocity) { if (_bomb != null) { _world.DestroyBody(_bomb); _bomb = null; } BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = position; bd.bullet = true; _bomb = _world.CreateBody(bd); _bomb.SetLinearVelocity(velocity); CircleShape circle = new CircleShape(); circle._radius = 0.3f; FixtureDef fd = new FixtureDef(); fd.shape = circle; fd.density = 20.0f; fd.restitution = 0.0f; Vector2 minV = position - new Vector2(0.3f,0.3f); Vector2 maxV = position + new Vector2(0.3f,0.3f); AABB aabb; aabb.lowerBound = minV; aabb.upperBound = maxV; _bomb.CreateFixture(fd); }
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); } } }
private void Create(int index) { if (_bodies[_bodyIndex] != null) { _world.DestroyBody(_bodies[_bodyIndex]); _bodies[_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 Vector2(x, y); bd.angle = Rand.RandomFloat(-(float)Math.PI, (float)Math.PI); bd.userData = index; if (index == 4) { bd.angularDamping = 0.02f; } _bodies[_bodyIndex] = _world.CreateBody(bd); if (index < 4) { FixtureDef fd = new FixtureDef(); fd.shape = _polygons[index]; fd.friction = 0.3f; _bodies[_bodyIndex].CreateFixture(fd); } else { FixtureDef fd = new FixtureDef(); fd.shape = _circle; fd.friction = 0.3f; _bodies[_bodyIndex].CreateFixture(fd); } _bodyIndex = (_bodyIndex + 1) % e_maxBodies; }
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 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 CollisionProcessing() { // Ground body { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-50.0f, 0.0f), new Vector2(50.0f, 0.0f)); FixtureDef sd = new FixtureDef(); sd.shape = shape; BodyDef bd = new BodyDef(); Body ground = _world.CreateBody(bd); ground.CreateFixture(sd); } float xLo = -5.0f, xHi = 5.0f; float yLo = 2.0f, yHi = 35.0f; // Small triangle Vector2[] vertices = new Vector2[3]; vertices[0] = new Vector2(-1.0f, 0.0f); vertices[1] = new Vector2(1.0f, 0.0f); vertices[2] = new Vector2(0.0f, 2.0f); PolygonShape polygon = new PolygonShape(); polygon.Set(vertices, 3); FixtureDef triangleShapeDef = new FixtureDef(); triangleShapeDef.shape = polygon; triangleShapeDef.density = 1.0f; BodyDef triangleBodyDef = new BodyDef(); triangleBodyDef.type = BodyType.Dynamic; triangleBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); Body body1 = _world.CreateBody(triangleBodyDef); body1.CreateFixture(triangleShapeDef); // Large triangle (recycle definitions) vertices[0] *= 2.0f; vertices[1] *= 2.0f; vertices[2] *= 2.0f; polygon.Set(vertices, 3); triangleBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); Body body2 = _world.CreateBody(triangleBodyDef); body2.CreateFixture(triangleShapeDef); // Small box polygon.SetAsBox(1.0f, 0.5f); FixtureDef boxShapeDef = new FixtureDef(); boxShapeDef.shape = polygon; boxShapeDef.density = 1.0f; BodyDef boxBodyDef = new BodyDef(); boxBodyDef.type = BodyType.Dynamic; boxBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); Body body3 = _world.CreateBody(boxBodyDef); body3.CreateFixture(boxShapeDef); // Large box (recycle definitions) polygon.SetAsBox(2.0f, 1.0f); boxBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); Body body4 = _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; BodyDef circleBodyDef = new BodyDef(); circleBodyDef.type = BodyType.Dynamic; circleBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); Body body5 = _world.CreateBody(circleBodyDef); body5.CreateFixture(circleShapeDef); // Large circle circle._radius *= 2.0f; circleBodyDef.position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); Body body6 = _world.CreateBody(circleBodyDef); body6.CreateFixture(circleShapeDef); }
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); FixtureDef fd1 = new FixtureDef(); FixtureDef fd2 = new FixtureDef(); fd1.filter.groupIndex = -1; fd2.filter.groupIndex = -1; fd1.density = 1.0f; fd2.density = 1.0f; PolygonShape poly1 = new PolygonShape(); PolygonShape poly2 = new PolygonShape(); Vector2[] vertices = new Vector2[3]; if (s > 0.0f) { vertices[0] = p1; vertices[1] = p2; vertices[2] = p3; poly1.Set(vertices, 3); vertices[0] = Vector2.Zero; vertices[1] = p5 - p4; vertices[2] = p6 - p4; poly2.Set(vertices, 3); } else { vertices[0] = p1; vertices[1] = p3; vertices[2] = p2; poly1.Set(vertices, 3); vertices[0] = Vector2.Zero; vertices[1] = p6 - p4; vertices[2] = p5 - p4; poly2.Set(vertices, 3); } fd1.shape = poly1; fd2.shape = poly2; BodyDef bd1 = new BodyDef(); BodyDef bd2 = new BodyDef(); bd1.type = BodyType.Dynamic; bd2.type = BodyType.Dynamic; bd1.position = _offset; bd2.position = p4 + _offset; bd1.angularDamping = 10.0f; bd2.angularDamping = 10.0f; Body body1 = _world.CreateBody(bd1); Body body2 = _world.CreateBody(bd2); body1.CreateFixture(fd1); body2.CreateFixture(fd2); DistanceJointDef djd = new DistanceJointDef(); // Using a soft distanceraint can reduce some jitter. // It also makes the structure seem a bit more fluid by // acting like a suspension system. djd.dampingRatio = 0.5f; djd.frequencyHz = 10.0f; djd.Initialize(body1, body2, p2 + _offset, p5 + _offset); _world.CreateJoint(djd); djd.Initialize(body1, body2, p3 + _offset, p4 + _offset); _world.CreateJoint(djd); djd.Initialize(body1, _wheel, p3 + _offset, wheelAnchor + _offset); _world.CreateJoint(djd); djd.Initialize(body2, _wheel, p6 + _offset, wheelAnchor + _offset); _world.CreateJoint(djd); RevoluteJointDef rjd = new RevoluteJointDef(); rjd.Initialize(body2, _chassis, p4 + _offset); _world.CreateJoint(rjd); }
public override void Step(Framework.Settings settings) { base.Step(settings); _debugDraw.DrawString(50, _textLine, "Press: (,) to launch a bullet."); if (_stepCount == 300) { if (_bullet != null) { _world.DestroyBody(_bullet); _bullet = null; } { CircleShape shape = new CircleShape(); shape._radius = 0.25f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; fd.restitution = 0.05f; BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.bullet = true; bd.position = new Vector2(-31.0f, 5.0f); _bullet = _world.CreateBody(bd); _bullet.CreateFixture(fd); _bullet.SetLinearVelocity(new Vector2(400.0f, 0.0f)); } } _textLine += 15; }
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 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 CollisionFiltering() { // Ground body { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); FixtureDef sd = new FixtureDef(); sd.shape = shape; sd.friction = 0.3f; BodyDef bd = new BodyDef(); Body ground = _world.CreateBody(bd); ground.CreateFixture(sd); } // Small triangle Vector2[] vertices = new Vector2[3]; vertices[0] = new Vector2(-1.0f, 0.0f); vertices[1] = new Vector2(1.0f, 0.0f); vertices[2] = new Vector2(0.0f, 2.0f); PolygonShape polygon = new PolygonShape(); polygon.Set(vertices, 3); FixtureDef triangleShapeDef = new FixtureDef(); triangleShapeDef.shape = polygon; triangleShapeDef.density = 1.0f; triangleShapeDef.filter.groupIndex = k_smallGroup; triangleShapeDef.filter.categoryBits = k_triangleCategory; triangleShapeDef.filter.maskBits = k_triangleMask; BodyDef triangleBodyDef = new BodyDef(); triangleBodyDef.type = BodyType.Dynamic; triangleBodyDef.position = new Vector2(-5.0f, 2.0f); Body body1 = _world.CreateBody(triangleBodyDef); body1.CreateFixture(triangleShapeDef); // Large triangle (recycle definitions) vertices[0] *= 2.0f; vertices[1] *= 2.0f; vertices[2] *= 2.0f; polygon.Set(vertices, 3); triangleShapeDef.filter.groupIndex = k_largeGroup; triangleBodyDef.position = new Vector2(-5.0f, 6.0f); triangleBodyDef.fixedRotation = true; // look at me! Body body2 = _world.CreateBody(triangleBodyDef); body2.CreateFixture(triangleShapeDef); { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-5.0f, 10.0f); Body body = _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 Vector2(0.0f, 4.0f); jd.localAnchorB = Vector2.Zero; jd.localAxis1 = new Vector2(0.0f, 1.0f); jd.lowerTranslation = -1.0f; jd.upperTranslation = 1.0f; _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.groupIndex = k_smallGroup; boxShapeDef.filter.categoryBits = k_boxCategory; boxShapeDef.filter.maskBits = k_boxMask; BodyDef boxBodyDef = new BodyDef(); boxBodyDef.type = BodyType.Dynamic; boxBodyDef.position = new Vector2(0.0f, 2.0f); Body body3 = _world.CreateBody(boxBodyDef); body3.CreateFixture(boxShapeDef); // Large box (recycle definitions) polygon.SetAsBox(2.0f, 1.0f); boxShapeDef.filter.groupIndex = k_largeGroup; boxBodyDef.position = new Vector2(0.0f, 6.0f); Body body4 = _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.groupIndex = k_smallGroup; circleShapeDef.filter.categoryBits = k_circleCategory; circleShapeDef.filter.maskBits = k_circleMask; BodyDef circleBodyDef = new BodyDef(); circleBodyDef.type = BodyType.Dynamic; circleBodyDef.position = new Vector2(5.0f, 2.0f); Body body5 = _world.CreateBody(circleBodyDef); body5.CreateFixture(circleShapeDef); // Large circle circle._radius *= 2.0f; circleShapeDef.filter.groupIndex = k_largeGroup; circleBodyDef.position = new Vector2(5.0f, 6.0f); Body body6 = _world.CreateBody(circleBodyDef); body6.CreateFixture(circleShapeDef); }
public Dominos() { Body b1 = null; { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); BodyDef bd = new BodyDef(); b1 = _world.CreateBody(bd); b1.CreateFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(6.0f, 0.25f); BodyDef bd = new BodyDef(); bd.position = new Vector2(-1.5f, 10.0f); Body ground = _world.CreateBody(bd); ground.CreateFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.1f, 1.0f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; fd.friction = 0.1f; for (int i = 0; i < 10; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-6.0f + 1.0f * i, 11.25f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); } } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(7.0f, 0.25f, Vector2.Zero, 0.3f); BodyDef bd = new BodyDef(); bd.position = new Vector2(1.0f, 6.0f); Body ground = _world.CreateBody(bd); ground.CreateFixture(shape, 0.0f); } Body b2 = null; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.25f, 1.5f); BodyDef bd = new BodyDef(); bd.position = new Vector2(-7.0f, 4.0f); b2 = _world.CreateBody(bd); b2.CreateFixture(shape, 0.0f); } Body b3 = null; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(6.0f, 0.125f); BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-0.9f, 1.0f); bd.angle = -0.15f; b3 = _world.CreateBody(bd); b3.CreateFixture(shape, 10.0f); } RevoluteJointDef jd = new RevoluteJointDef(); Vector2 anchor; anchor = new Vector2(-2.0f, 1.0f); jd.Initialize(b1, b3, anchor); jd.collideConnected = true; _world.CreateJoint(jd); Body b4 = null; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.25f, 0.25f); BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-10.0f, 15.0f); b4 = _world.CreateBody(bd); b4.CreateFixture(shape, 10.0f); } anchor = new Vector2(-7.0f, 15.0f); jd.Initialize(b2, b4, anchor); _world.CreateJoint(jd); Body b5 = null; { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(6.5f, 3.0f); b5 = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 10.0f; fd.friction = 0.1f; shape.SetAsBox(1.0f, 0.1f, new Vector2(0.0f, -0.9f), 0.0f); b5.CreateFixture(fd); shape.SetAsBox(0.1f, 1.0f, new Vector2(-0.9f, 0.0f), 0.0f); b5.CreateFixture(fd); shape.SetAsBox(0.1f, 1.0f, new Vector2(0.9f, 0.0f), 0.0f); b5.CreateFixture(fd); } anchor = new Vector2(6.0f, 2.0f); jd.Initialize(b1, b5, anchor); _world.CreateJoint(jd); Body b6 = null; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(1.0f, 0.1f); BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(6.5f, 4.1f); b6 = _world.CreateBody(bd); b6.CreateFixture(shape, 30.0f); } anchor = new Vector2(7.5f, 4.0f); jd.Initialize(b5, b6, anchor); _world.CreateJoint(jd); Body b7 = null; { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.1f, 1.0f); BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(7.4f, 1.0f); b7 = _world.CreateBody(bd); b7.CreateFixture(shape, 10.0f); } DistanceJointDef djd = new DistanceJointDef(); djd.bodyA = b3; djd.bodyB = b7; djd.localAnchorA = new Vector2(6.0f, 0.0f); djd.localAnchorB = new Vector2(0.0f, -1.0f); Vector2 d = djd.bodyB.GetWorldPoint(djd.localAnchorB) - djd.bodyA.GetWorldPoint(djd.localAnchorA); djd.length = d.Length(); _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.type = BodyType.Dynamic; bd.position = new Vector2(5.9f + 2.0f * radius * i, 2.4f); Body body = _world.CreateBody(bd); body.CreateFixture(shape, 10.0f); } } }
public Cantilever() { Body ground = null; { BodyDef bd = new BodyDef(); ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; WeldJointDef jd = new WeldJointDef(); Body prevBody = ground; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-14.5f + 1.0f * i, 5.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); Vector2 anchor = new Vector2(-15.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); _world.CreateJoint(jd); prevBody = body; } } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; WeldJointDef jd = new WeldJointDef(); Body prevBody = ground; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-14.5f + 1.0f * i, 15.0f); bd.inertiaScale = 10.0f; Body body = _world.CreateBody(bd); body.CreateFixture(fd); Vector2 anchor = new Vector2(-15.0f + 1.0f * i, 15.0f); jd.Initialize(prevBody, body, anchor); _world.CreateJoint(jd); prevBody = body; } } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; WeldJointDef jd = new WeldJointDef(); Body prevBody = ground; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-4.5f + 1.0f * i, 5.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); if (i > 0) { Vector2 anchor = new Vector2(-5.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); _world.CreateJoint(jd); } prevBody = body; } } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; WeldJointDef jd = new WeldJointDef(); Body prevBody = ground; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(5.5f + 1.0f * i, 10.0f); bd.inertiaScale = 10.0f; Body body = _world.CreateBody(bd); body.CreateFixture(fd); if (i > 0) { Vector2 anchor = new Vector2(5.0f + 1.0f * i, 10.0f); jd.Initialize(prevBody, body, anchor); _world.CreateJoint(jd); } prevBody = body; } } for (int i = 0; i < 2; ++i) { Vector2[] vertices = new Vector2[3]; vertices[0] = new Vector2(-0.5f, 0.0f); vertices[1] = new Vector2(0.5f, 0.0f); vertices[2] = new Vector2(0.0f, 1.5f); PolygonShape shape = new PolygonShape(); shape.Set(vertices, 3); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 1.0f; BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-8.0f + 8.0f * i, 12.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); } for (int i = 0; i < 2; ++i) { CircleShape shape = new CircleShape(); shape._radius = 0.5f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 1.0f; BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-6.0f + 6.0f * i, 10.0f); Body body = _world.CreateBody(bd); body.CreateFixture(fd); } }
public FixtureNode(FixtureDef fixture) : base("Fixture") { Fixture = fixture; }
TheoJansen() { _offset = new Vector2(0.0f, 8.0f); _motorSpeed = 2.0f; _motorOn = true; Vector2 pivot = new Vector2(0.0f, 0.8f); // Ground { BodyDef bd = new BodyDef(); Body ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-50.0f, 0.0f), new Vector2(50.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); shape.SetAsEdge(new Vector2(-50.0f, 0.0f), new Vector2(-50.0f, 10.0f)); ground.CreateFixture(shape, 0.0f); shape.SetAsEdge(new Vector2(50.0f, 0.0f), new Vector2(50.0f, 10.0f)); ground.CreateFixture(shape, 0.0f); } // Balls for (int i = 0; i < 40; ++i) { CircleShape shape = new CircleShape(); shape._radius = 0.25f; BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(-40.0f + 2.0f * i, 0.5f); Body body = _world.CreateBody(bd); body.CreateFixture(shape, 1.0f); } // Chassis { PolygonShape shape = new PolygonShape(); shape.SetAsBox(2.5f, 1.0f); FixtureDef sd = new FixtureDef(); sd.density = 1.0f; sd.shape = shape; sd.filter.groupIndex = -1; BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = pivot + _offset; _chassis = _world.CreateBody(bd); _chassis.CreateFixture(sd); } { CircleShape shape = new CircleShape(); shape._radius = 1.6f; FixtureDef sd = new FixtureDef(); sd.density = 1.0f; sd.shape = shape; sd.filter.groupIndex = -1; BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = pivot + _offset; _wheel = _world.CreateBody(bd); _wheel.CreateFixture(sd); } { RevoluteJointDef jd = new RevoluteJointDef(); jd.Initialize(_wheel, _chassis, pivot + _offset); jd.collideConnected = false; jd.motorSpeed = _motorSpeed; jd.maxMotorTorque = 400.0f; jd.enableMotor = _motorOn; _motorJoint = (RevoluteJoint)_world.CreateJoint(jd); } Vector2 wheelAnchor; wheelAnchor = pivot + new Vector2(0.0f, -0.8f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); _wheel.SetTransform(_wheel.GetPosition(), 120.0f * (float)Settings.b2_pi / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); _wheel.SetTransform(_wheel.GetPosition(), -120.0f * (float)Settings.b2_pi / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); }