/** * Creates a new circle object. */ public CircleObject(World world, string texturename, float density, float friction, float restitution,float myScale) : base(world) { textureName = texturename; // Initialize this.texture = GameEngine.TextureList[texturename]; TextureFilename = texturename; Width = texture.Width * myScale; Height = Width; scale = myScale; // Determine dimension float radius = (float)texture.Width / (2 * CASSWorld.SCALE) * scale; // Create collision shape CircleDef shape = new CircleDef(); shape.Radius = radius; shape.Density = density; shape.Friction = friction; shape.Restitution = restitution; shapes.Add(shape); }
public (Body, Drawable) ToBody(World world) { var circleBody = world.CreateBody(new BodyDef { Position = new Vec2(PosX, PosY), FixedRotation = true, }); var circleDef = new CircleDef { Radius = Radius, Density = Density, Friction = Friction, }; circleBody.CreateShape(circleDef); var drawable = new CircleDrawable( circleBody, System.Windows.Media.Color.FromRgb( (byte)(Friction * 255.0f), 80, (byte)(Density * 255.0f)), circleDef); circleBody.SetMassFromShapes(); return(circleBody, drawable); }
public void AddCircle(float x, float y, float radius, float angle, float density, float friction, float restetution, float mass, bool IsBullet = true, bool IsSensor = false, bool AllowSleep = false, short group_index = 1, Object userDate = null) { BodyDef bDef = new BodyDef(); bDef.Position.Set(x / metric, y / metric); bDef.Angle = angle; bDef.AllowSleep = AllowSleep; bDef.IsBullet = IsBullet; CircleDef pDef = new CircleDef(); pDef.Restitution = restetution; pDef.Friction = friction; pDef.Density = density; pDef.Radius = radius / metric; pDef.Filter.GroupIndex = group_index; pDef.IsSensor = IsSensor; Body body = world.CreateBody(bDef); body.CreateShape(pDef); body.SetMassFromShapes(); float Inertia = body.GetInertia(); MassData md = new MassData(); md.I = Inertia; md.Mass = mass; body.SetMass(md); }
public VaryingRestitution() { { PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 10.0f); BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, -10.0f); Body ground = _world.CreateBody(bd); ground.CreateShape(sd); } { CircleDef sd = new CircleDef(); sd.Radius = 1.0f; sd.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.Position.Set(-10.0f + 3.0f * i, 20.0f); Body body = _world.CreateBody(bd); sd.Restitution = restitution[i]; body.CreateShape(sd); body.SetMassFromShapes(); } } }
public virtual void SetupPhysics(World world) { float angle = Object.EulerAngles.z; angle = angle * Mathf.Deg2Rad; bodyDef = new BodyDef(); bodyDef.Position.Set(Object.Position.x, Object.Position.y); bodyDef.Angle = angle; circleDef = new CircleDef(); circleDef.Restitution = 0.2f; circleDef.Friction = 0.3f; circleDef.Density = 0.5f; circleDef.Radius = Mathf.Max(Object.Size.x / 3f, Object.Size.y / 3f, Object.Size.z / 3f); body = world.CreateBody(bodyDef); while (body == null) { body = world.CreateBody(bodyDef); } body.CreateShape(circleDef); body.SetMassFromShapes(); body.SetUserData(this); this.world = world; }
public void Reset() { if (b2Body != null) { refWorld.B2World.DestroyBody(b2Body); b2Body.Dispose(); } b2BodyDef = new BodyDef(); b2CircleDef = new CircleDef(); b2BodyDef.Angle = Angle / 180.0f * 3.14f; b2BodyDef.Position = PhysicalConvert.Tob2Vector(Position); b2CircleDef.Radius = PhysicalConvert.Tob2Single(OuterDiameter / 2.0f); b2CircleDef.Density = Density; b2CircleDef.Restitution = Restitution; b2CircleDef.Friction = Friction; b2CircleDef.Filter = new FilterData() { GroupIndex = GroupIndex, CategoryBits = CategoryBits, MaskBits = MaskBits }; b2Body = refWorld.B2World.CreateBody(b2BodyDef); b2Body.CreateFixture(b2CircleDef); if (physicalShapeType == PhysicalShapeType.Dynamic) { b2Body.SetMassFromShapes(); } }
public override void Keyboard(System.Windows.Forms.Keys key) { switch (key) { case System.Windows.Forms.Keys.C: if (_shape2 == null) { CircleDef sd = new CircleDef(); sd.Radius = 3.0f; sd.Density = 10.0f; sd.LocalPosition.Set(0.5f, -4.0f); _shape2 = _body.CreateShape(sd); _body.SetMassFromShapes(); _body.WakeUp(); } break; case System.Windows.Forms.Keys.D: if (_shape2 != null) { _body.DestroyShape(_shape2); _shape2 = null; _body.SetMassFromShapes(); _body.WakeUp(); } break; } }
public override void Keyboard(System.Windows.Forms.Keys key) { switch (key) { case System.Windows.Forms.Keys.B: if (_bullet != null) { _world.DestroyBody(_bullet); _bullet = null; } { CircleDef sd = new CircleDef(); sd.Density = 20.0f; sd.Radius = 0.25f; sd.Restitution = 0.05f; BodyDef bd = new BodyDef(); bd.IsBullet = true; bd.Position.Set(-31.0f, 5.0f); _bullet = _world.CreateBody(bd); _bullet.CreateFixture(sd); _bullet.SetMassFromShapes(); _bullet.SetLinearVelocity(new Vec2(400.0f, 0.0f)); } break; } }
void LaunchBomb() { if (bomb != null) { world.DestroyBody(bomb); bomb = null; } BodyDef bd = new BodyDef(); bd.BodyType = BodyType.e_dynamicBody; bd.AllowSleep = true; Random rand = new Random(); bd.Position = new Vector((float)rand.NextDouble() * 30 - 15, 30.0f); bd.IsBullet = true; bomb = world.CreateBody(bd); bomb.LinearVelocity = bd.Position * -5; CircleDef sd = new CircleDef(); sd.Radius = 0.3f; sd.Density = 20.0f; sd.Restitution = 0.1f; bomb.CreateShape(sd); bomb.SetMassFromShapes(); }
public void LaunchBomb() { if (_bomb != null) { _world.DestroyBody(_bomb); _bomb = null; } BodyDef bd = new BodyDef(); bd.AllowSleep = true; bd.Position.Set(Box2DNet.Common.Math.Random(-15.0f, 15.0f), 30.0f); bd.IsBullet = true; _bomb = _world.CreateBody(bd); _bomb.SetLinearVelocity(-5.0f * bd.Position); CircleDef sd = new CircleDef(); sd.Radius = 0.3f; sd.Density = 20.0f; sd.Restitution = 0.1f; _bomb.CreateFixture(sd); _bomb.SetMassFromShapes(); }
public MyModel3D AddCircle(float x, float y, float radius, float angle, float density, float friction, float restetution) { MyModel3D model = new MyModel3D(models, x, -y, 0, Environment.CurrentDirectory + "\\" + PATH_CIRCLE, new System.Windows.Size(radius * 2, radius * 2)); BodyDef bDef = new BodyDef(); bDef.Position.Set(x, y); bDef.Angle = angle; CircleDef pDef = new CircleDef(); pDef.Restitution = restetution; pDef.Friction = friction; pDef.Density = density; pDef.Radius = radius; Body body = world.CreateBody(bDef); body.CreateShape(pDef); body.SetMassFromShapes(); body.SetUserData(model); return(model); }
public Player(World world, Vector2 midPoint, PlayerController controller) { // sprite for rendering sprite = new AnimatedSprite(new Texture("Textures/Character/idle_00.png"), 0.05F, 20, new Vector2i(62, 50)); sprite.Origin = ((Vector2)sprite.spriteSize) / 2F; sprite.Scale = Vector2.One * 1.4F; sprite.restartAnimation(Program.gameTime); // controller this.controller = controller; // set properties this.size = new Vector2(1F, 1F); // Physics init BodyDef bodydef = new BodyDef(); bodydef.Position.Set(midPoint.X, midPoint.Y); body = world.CreateBody(bodydef); CircleDef circleDef = new CircleDef(); circleDef.Radius = 0.5F; circleDef.Density = 1.0F; circleDef.Friction = 1.0F; circleDef.Restitution = 0.0F; body.SetUserData(this); body.CreateShape(circleDef); body.SetMassFromShapes(); // weapon weapon = new Weapon(WeaponType.Gatling); }
private static ShapeDef CreateBaseCircleDef(PhysicsSetups setups, SizeF size) { ShapeDef circleShape = new CircleDef(); (circleShape as CircleDef).Radius = size.Width / 2; circleShape.Restitution = setups.restetution; circleShape.Friction = setups.friction; circleShape.Density = setups.density; return(circleShape); }
public static void DefineBody(EntityID entity, Registry registry, PhysicsWorld2D physicsWorld, TransformComponent transform) { var rigidBody = registry.GetComponent <RigidBody2D>(entity); BodyDef bodyDef = new BodyDef(); bodyDef.Position = Util.UtilFunctions.ToVec2(transform.Position / PhysicsWorld2D.PixelToMeter); bodyDef.Angle = transform.Rotation.Z; bodyDef.AngularDamping = rigidBody.AngularDamping; bodyDef.LinearDamping = rigidBody.LinearDamping; bodyDef.FixedRotation = rigidBody.FixedRotation; bodyDef.IsSleeping = false; bodyDef.IsBullet = rigidBody.IsBullet; Body body = physicsWorld.World.CreateBody(bodyDef); FixtureDef shapeDef = null; if (registry.TryGetComponent(entity, out BoxCollider box)) { shapeDef = new PolygonDef(); ((PolygonDef)shapeDef).SetAsBox((box.Width / 2) / PhysicsWorld2D.PixelToMeter, (box.Height / 2) / PhysicsWorld2D.PixelToMeter); } else if (registry.TryGetComponent(entity, out CircleCollider circle)) { shapeDef = new CircleDef(); ((CircleDef)shapeDef).Radius = circle.Radius; } shapeDef.Density = rigidBody.Density; shapeDef.Friction = rigidBody.Friction; shapeDef.Restitution = rigidBody.Restitution; body.CreateFixture(shapeDef); if (rigidBody.Mass > 0) { MassData massData = new MassData(); massData.Mass = rigidBody.Mass; massData.Center = body.GetLocalCenter(); body.SetMass(massData); } else { body.SetMassFromShapes(); } body.SetUserData(entity); if (rigidBody.StartVelocity != Vector2.Zero) { body.SetLinearVelocity(Util.UtilFunctions.ToVec2(rigidBody.StartVelocity)); } rigidBody.SetBody(body); }
/// <summary> /// Creates a circle geometry and attaches it to a body. /// </summary> /// <param name="body">Body to attach circle too.</param> /// <param name="radius">Radius of the circle.</param> /// <returns></returns> public Shape CreateCircleGeom(Body body, float radius) { CircleDef geomDef = new CircleDef(); geomDef.Radius = radius; // add the shape to the body Shape geom = body.CreateShape(geomDef); // set the mass from the all the shapes associated with the body body.SetMassFromShapes(); return(geom); }
protected override void CreatePhysics(World world, float positionX, float positionY, float friction) { var bodyDef = new BodyDef(); bodyDef.Position.Set(positionX, positionY); bodyDef.LinearDamping = 0.3f; bodyDef.AngularDamping = 0.6f; var circleDef = new CircleDef(); circleDef.Density = this.Density; circleDef.Radius = this.Radius * 0.5f; circleDef.Friction = friction; circleDef.Restitution = 0.3f; this.body = world.CreateBody(bodyDef); this.body.CreateShape(circleDef); this.body.SetMassFromShapes(); }
public RigidBody CreateCircleDef(float restetution, float friction, float density, float radius, short group_index = 1, bool isSensor = false) { var pDef = new CircleDef(); pDef.Restitution = restetution; pDef.Friction = friction; pDef.Density = density; pDef.Radius = radius / PhysicsController.metric; pDef.Filter.GroupIndex = group_index; pDef.IsSensor = isSensor; _shapeDef = pDef; return(this); }
private Body CreatePole(Vec2 basePose, float angle, float radius, float friction, float restitution, float density, ushort layers) { const float __poleLength = 1f; // ==== Create bar. ==== // Determine position of top of pole with base position of (0, 0), length of 1m and an angle CCW is +ve. Vec2 polePosTop = new Vec2(__poleLength * (float)-SysMath.Sin(angle), __poleLength * (float)SysMath.Cos(angle)); Vec2 polePosCenter = (polePosTop * 0.5f) + basePose; BodyDef bodyDef = new BodyDef(); bodyDef.Position.Set(polePosCenter.X, polePosCenter.Y); bodyDef.Angle = angle; // Create body object; The body is also added to the world. Body body = _world.CreateBody(bodyDef); PolygonDef shapeDef = new PolygonDef(); shapeDef.SetAsBox(radius, __poleLength * 0.5f); shapeDef.Friction = friction; shapeDef.Restitution = restitution; shapeDef.Density = density; shapeDef.Filter.MaskBits = layers; shapeDef.Filter.CategoryBits = 0x3; body.CreateShape(shapeDef); // ==== Place some end caps on the pole. ==== CircleDef circleDef = new CircleDef(); circleDef.Radius = radius; circleDef.Friction = friction; circleDef.Restitution = restitution; circleDef.Density = 0f; circleDef.Filter.MaskBits = layers; circleDef.Filter.CategoryBits = 0x3; // Top cap. circleDef.LocalPosition.Set(0f, __poleLength * 0.5f); body.CreateShape(circleDef); // Bottom cap. circleDef.LocalPosition.Set(0f, -__poleLength * 0.5f); body.CreateShape(circleDef); body.SetMassFromShapes(); return(body); }
public Buoyancy() { BuoyancyController bc = _bc; _world.AddController(bc); bc.Offset = 15; bc.Normal.Set(0, 1); bc.Density = 2; bc.LinearDrag = 2; bc.AngularDrag = 1; for (int i = 0; i < 2; ++i) { PolygonDef sd = new PolygonDef(); sd.VertexCount = 3; sd.Vertices[0].Set(-0.5f, 0.0f); sd.Vertices[1].Set(0.5f, 0.0f); sd.Vertices[2].Set(0.0f, 1.5f); sd.Density = 1.0f; BodyDef bd = new BodyDef(); bd.Position.Set(-8.0f + 8.0f * i, 12.0f); Body body = _world.CreateBody(bd); body.CreateFixture(sd); body.SetMassFromShapes(); bc.AddBody(body); } for (int i = 0; i < 3; ++i) { CircleDef sd = new CircleDef(); sd.Radius = 0.5f; sd.Density = 1.0f; BodyDef bd = new BodyDef(); bd.Position.Set(-6.0f + 6.0f * i, 10.0f); Body body = _world.CreateBody(bd); body.CreateFixture(sd); body.SetMassFromShapes(); bc.AddBody(body); } }
BipedTest() { const float k_restitution = 1.4f; { BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, 20.0f); Body body = _world.CreateBody(bd); PolygonDef sd = new PolygonDef(); sd.Density = 0.0f; sd.Restitution = k_restitution; sd.SetAsBox(0.1f, 10.0f, new Vec2(-10.0f, 0.0f), 0.0f); body.CreateShape(sd); sd.SetAsBox(0.1f, 10.0f, new Vec2(10.0f, 0.0f), 0.0f); body.CreateShape(sd); sd.SetAsBox(0.1f, 10.0f, new Vec2(0.0f, -10.0f), 0.5f * Box2DX.Common.Settings.Pi); body.CreateShape(sd); sd.SetAsBox(0.1f, 10.0f, new Vec2(0.0f, 10.0f), -0.5f * Box2DX.Common.Settings.Pi); body.CreateShape(sd); } _biped = new Biped(_world, new Vec2(0.0f, 20.0f)); for (int i = 0; i < 8; ++i) { BodyDef bd = new BodyDef(); bd.Position.Set(5.0f, 20.0f + i); bd.IsBullet = true; Body body = _world.CreateBody(bd); body.SetLinearVelocity(new Vec2(0.0f, -100.0f)); body.SetAngularVelocity(Box2DX.Common.Math.Random(-50.0f, 50.0f)); CircleDef sd = new CircleDef(); sd.Radius = 0.25f; sd.Density = 15.0f; sd.Restitution = k_restitution; body.CreateShape(sd); body.SetMassFromShapes(); } }
public Buoyancy() { BuoyancyController bc = _bc; _world.AddController(bc); bc.offset = 15; bc.normal.Set(0, 1); bc.density = 2; bc.linearDrag = 2; bc.angularDrag = 1; for (int i = 0; i < 2; ++i) { PolygonDef sd = new PolygonDef(); sd.VertexCount = 3; sd.Vertices[0].Set(-0.5f, 0.0f); sd.Vertices[1].Set(0.5f, 0.0f); sd.Vertices[2].Set(0.0f, 1.5f); sd.Density = 1.0f; BodyDef bd = new BodyDef(); bd.Position.Set(-8.0f + 8.0f * i, 12.0f); Body body = _world.CreateBody(bd); body.CreateShape(sd); body.SetMassFromShapes(); bc.AddBody(body); } for (int i = 0; i < 3; ++i) { CircleDef sd = new CircleDef(); sd.Radius = 0.5f; sd.Density = 1.0f; BodyDef bd = new BodyDef(); bd.Position.Set(-6.0f + 6.0f * i, 10.0f); Body body = _world.CreateBody(bd); body.CreateShape(sd); body.SetMassFromShapes(); bc.AddBody(body); } }
private void GenMultiIslands() { Log.Message("[Map Designer] Island Multispawn"); outerRadius /= 2; innerRadius /= 2; //beachSize /= 2; List <CircleDef> islandList = new List <CircleDef>(); islandList.Add(new CircleDef(center, outerRadius)); CircleDef circle = new CircleDef(center, outerRadius); islandList = GenNestedCircles(circle, islandList); List <CircleDef> finalIslands = new List <CircleDef>(); islandList = islandList.OrderByDescending(ci => ci.Radius).ToList(); foreach (CircleDef c in islandList) { if (c.Radius > 3) { if (c.Center.DistanceToEdge(myMap) >= 15) { List <IntVec3> newCells = HelperMethods.GenCircle(myMap, c.Center, c.Radius); if (!newCells.Intersect(beachCells).Any()) { finalIslands.Add(c); beachCells.AddRange(HelperMethods.GenCircle(myMap, c.Center, c.Radius)); } } } } foreach (CircleDef f in finalIslands) { if (f.Radius > beachSize * 2) { landCells.AddRange(HelperMethods.GenCircle(myMap, f.Center, f.Radius - beachSize)); beachCells = beachCells.Except(HelperMethods.GenCircle(myMap, f.Center, f.Radius - beachSize)).ToList(); } } }
public Revolute() { Body ground = null; { PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 10.0f); BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, -10.0f); ground = _world.CreateBody(bd); ground.CreateShape(sd); } { CircleDef sd = new CircleDef(); sd.Radius = 0.5f; sd.Density = 5.0f; BodyDef bd = new BodyDef(); RevoluteJointDef rjd = new RevoluteJointDef(); bd.Position.Set(0.0f, 20.0f); Body body = _world.CreateBody(bd); body.CreateShape(sd); body.SetMassFromShapes(); float w = 100.0f; body.SetAngularVelocity(w); body.SetLinearVelocity(new Vec2(-8.0f * w, 0.0f)); rjd.Initialize(ground, body, new Vec2(0.0f, 12.0f)); rjd.MotorSpeed = 1.0f * Box2DX.Common.Settings.Pi; rjd.MaxMotorTorque = 10000.0f; rjd.EnableMotor = false; rjd.LowerAngle = -0.25f * Box2DX.Common.Settings.Pi; rjd.UpperAngle = 0.5f * Box2DX.Common.Settings.Pi; rjd.EnableLimit = true; rjd.CollideConnected = true; _joint = (RevoluteJoint)_world.CreateJoint(rjd); } }
public Revolute() { Body ground = null; { PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 10.0f); BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, -10.0f); ground = _world.CreateBody(bd); ground.CreateFixture(sd); } { CircleDef sd = new CircleDef(); sd.Radius = 0.5f; sd.Density = 5.0f; BodyDef bd = new BodyDef(); RevoluteJointDef rjd = new RevoluteJointDef(); bd.Position.Set(0.0f, 20.0f); Body body = _world.CreateBody(bd); body.CreateFixture(sd); body.SetMassFromShapes(); float w = 100.0f; body.SetAngularVelocity(w); body.SetLinearVelocity(new Vec2(-8.0f * w, 0.0f)); rjd.Initialize(ground, body, new Vec2(0.0f, 12.0f)); rjd.MotorSpeed = 1.0f * Box2DNet.Common.Settings.Pi; rjd.MaxMotorTorque = 10000.0f; rjd.EnableMotor = false; rjd.LowerAngle = -0.25f * Box2DNet.Common.Settings.Pi; rjd.UpperAngle = 0.5f * Box2DNet.Common.Settings.Pi; rjd.EnableLimit = true; rjd.CollideConnected = true; _joint = (RevoluteJoint)_world.CreateJoint(rjd); } }
/// <summary> /// 初期化 /// </summary> /// <param name="shapeType">物理形状タイプ</param> /// <param name="world">登録するワールド</param> public PhysicalCircleShape(PhysicalShapeType shapeType, PhysicalWorld world) { density = 1.0f; restitution = 0.3f; base.Angle = 0.0f; groupIndex = 0; categoryBits = 0x0001; maskBits = 0xffff; b2BodyDef = new BodyDef(); b2CircleDef = new CircleDef(); refWorld = world; physicalShapeType = shapeType; b2Body = refWorld.B2World.CreateBody(b2BodyDef); b2Body.CreateFixture(b2CircleDef); if (physicalShapeType == PhysicalShapeType.Dynamic) { b2Body.SetMassFromShapes(); } world.Add(this); }
private void addCircle(Body body) { try { if (body.GetUserData() == null) { return; } GizmoComponents myGizmo = (GizmoComponents)body.GetUserData(); CircleDef circleDef = new CircleDef(); circleDef.Radius = myGizmo.Radius; circleDef.Density = myGizmo.Density; circleDef.Restitution = myGizmo.Restitution; circleDef.Friction = myGizmo.Friction; body.CreateFixture(circleDef); } catch (Exception e) { MessageBox.Show("PhysicalWorld-addBaffleX函数出错"); } }
public RaycastTest() { Body ground = null; { BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, -10.0f); ground = _world.CreateBody(bd); PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 10.0f); ground.CreateFixture(sd); } { BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, 1.0f); laserBody = _world.CreateBody(bd); PolygonDef sd = new PolygonDef(); sd.SetAsBox(5.0f, 1.0f); sd.Density = 4.0f; laserBody.CreateFixture(sd); laserBody.SetMassFromShapes(); Body body; //Create a few shapes bd.Position.Set(-5.0f, 10.0f); body = _world.CreateBody(bd); CircleDef cd = new CircleDef(); cd.Radius = 3; body.CreateFixture(cd); bd.Position.Set(5.0f, 10.0f); body = _world.CreateBody(bd); body.CreateFixture(cd); } }
public RaycastTest() { Body ground = null; { BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, -10.0f); ground = _world.CreateBody(bd); PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 10.0f); ground.CreateShape(sd); } { BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, 1.0f); laserBody = _world.CreateBody(bd); PolygonDef sd = new PolygonDef(); sd.SetAsBox(5.0f, 1.0f); sd.Density = 4.0f; laserBody.CreateShape(sd); laserBody.SetMassFromShapes(); Body body; //Create a few shapes bd.Position.Set(-5.0f, 10.0f); body = _world.CreateBody(bd); CircleDef cd = new CircleDef(); cd.Radius = 3; body.CreateShape(cd); bd.Position.Set(5.0f, 10.0f); body = _world.CreateBody(bd); body.CreateShape(cd); } }
//только для тестов public SolidBody(IGameObject parent) : base(parent) { shape = new RectangleF(60, 70, 5, 5); BodyDef bDef = new BodyDef(); bDef.Position.Set(shape.X, shape.Y); bDef.Angle = 0; bDef.FixedRotation = true; CircleDef pDef = new CircleDef(); pDef.Restitution = 0; pDef.Friction = 0; pDef.Density = 0.5f; pDef.Radius = shape.Width / 2; pDef.Filter.CategoryBits = 0; pDef.Filter.MaskBits = 0; Body = Parent.Model.Field.CreateBody(bDef); Body.CreateShape(pDef); Body.SetMassFromShapes(); Body.SetUserData(this); }
public InfoBody AddCircle(float x, float y, float radius, float angle, float density, float friction, float restetution, float mass, Image image, object userDate = null) { BodyDef bDef = new BodyDef(); bDef.Position.Set(x / metric, y / metric); bDef.Angle = angle; CircleDef pDef = new CircleDef(); pDef.Restitution = restetution; pDef.Friction = friction; pDef.Density = density; pDef.Radius = radius / metric; Body body = world.CreateBody(bDef); body.CreateShape(pDef); body.SetMassFromShapes(); float Inertia = body.GetInertia(); MassData md = new MassData(); md.I = Inertia; md.Mass = mass; body.SetMass(md); InfoBody info = new InfoBody(); info.image = image; info.body = body; info.userDate = userDate; body.SetUserData(info); return(info); }
public SensorTest() { { BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, -10.0f); Body ground = _world.CreateBody(bd); PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 10.0f); ground.CreateFixture(sd); CircleDef cd = new CircleDef(); cd.IsSensor = true; cd.Radius = 5.0f; cd.LocalPosition.Set(0.0f, 20.0f); _fixtureCircle = ground.CreateFixture(cd); _sensor = _fixtureCircle.Shape; } { CircleDef sd = new CircleDef(); sd.Radius = 1.0f; sd.Density = 1.0f; for (int i = 0; i < 7; ++i) { BodyDef bd = new BodyDef(); bd.Position.Set(-10.0f + 3.0f * i, 20.0f); Body body = _world.CreateBody(bd); body.CreateFixture(sd); body.SetMassFromShapes(); } } }
private static List <CircleDef> GenNestedCircles(CircleDef starterCircle, List <CircleDef> circles, int i = 0) { int radDist = starterCircle.Radius; if (i < 3) { IntRange additions = new IntRange((int)(radDist * 1.3), (int)(radDist * 3)); IntRange sizeWobble = new IntRange(-5, 5); for (int j = 0; j < 4 - i; j++) { IntVec3 newCenter = starterCircle.Center; if (Rand.Bool) { newCenter.x += additions.RandomInRange; } else { newCenter.x -= additions.RandomInRange; } if (Rand.Bool) { newCenter.z += additions.RandomInRange; } else { newCenter.z -= additions.RandomInRange; } CircleDef newCircle = new CircleDef(newCenter, (int)(sizeWobble.RandomInRange + radDist * 0.65)); circles.Add(newCircle); circles.Concat(GenNestedCircles(newCircle, circles, i + 1)); } } return(circles); }
public SensorTest() { { BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, -10.0f); Body ground = _world.CreateBody(bd); PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 10.0f); ground.CreateShape(sd); CircleDef cd = new CircleDef(); cd.IsSensor = true; cd.Radius = 5.0f; cd.LocalPosition.Set(0.0f, 20.0f); _sensor = ground.CreateShape(cd); } { CircleDef sd = new CircleDef(); sd.Radius = 1.0f; sd.Density = 1.0f; for (int i = 0; i < 7; ++i) { BodyDef bd = new BodyDef(); bd.Position.Set(-10.0f + 3.0f * i, 20.0f); Body body = _world.CreateBody(bd); body.CreateShape(sd); body.SetMassFromShapes(); } } }
public InfoBody AddCircle(float x, float y, float radius, float angle, float density, float friction, float restetution, Bitmap image, object userDate = null) { Image g_image = new Image(game); g_image.SetImage(image); g_image.SetWidth(radius * 2); g_image.SetHeight(radius * 2); BodyDef bDef = new BodyDef(); bDef.Position.Set(x / metric, y / metric); bDef.Angle = angle; CircleDef pDef = new CircleDef(); pDef.Restitution = restetution; pDef.Friction = friction; pDef.Density = density; pDef.Radius = radius / metric; Body body = world.CreateBody(bDef); body.CreateShape(pDef); body.SetMassFromShapes(); InfoBody info = new InfoBody(); info.image = g_image; info.body = body; info.userDate = userDate; body.SetUserData(info); return(info); }
private Body CreatePole(Vec2 basePose, float length, float angle, float radius, float density, ushort layers) { // ==== Create bar. ==== // Determine position of top of pole with base position of (0, 0), length of 1m and an angle CCW is +ve. Vec2 polePosTop = new Vec2(length * (float)-SysMath.Sin(angle), length * (float)SysMath.Cos(angle)); Vec2 polePosCenter = (polePosTop * 0.5f) + basePose; BodyDef bodyDef = new BodyDef(); bodyDef.Position.Set(polePosCenter.X, polePosCenter.Y); bodyDef.Angle = angle; bodyDef.IsBullet = true; // Create body object; The body is also added to the world. Body body = _world.CreateBody(bodyDef); PolygonDef shapeDef = new PolygonDef(); shapeDef.SetAsBox(radius, length * 0.5f); shapeDef.Friction = _simParams._defaultFriction; shapeDef.Restitution = _simParams._defaultRestitution; shapeDef.Density = density; shapeDef.Filter.MaskBits = 0xFFFE; shapeDef.Filter.CategoryBits = layers; body.CreateShape(shapeDef); // ==== Place some end caps on the pole. ==== CircleDef circleDef = new CircleDef(); circleDef.Radius = radius; circleDef.Friction = _simParams._defaultFriction; circleDef.Restitution = _simParams._defaultRestitution; circleDef.Density = density; circleDef.Filter.MaskBits = 0xFFFE; circleDef.Filter.CategoryBits = layers; // Top cap. circleDef.LocalPosition.Set(0f, length * 0.5f); body.CreateShape(circleDef); // Bottom cap. circleDef.LocalPosition.Set(0f, -length * 0.5f); body.CreateShape(circleDef); body.SetMassFromShapes(); return body; }
public override void Generate(Map map, GenStepParams parms) { IntVec3 center = map.Center; int outerRadius = (int)(0.01 * map.Size.x * MapDesignerMod.mod.settings.priIslandSize); int beachSize = (int)MapDesignerMod.mod.settings.priBeachSize; int innerRadius = outerRadius - beachSize; List <IntVec3> beachCells = new List <IntVec3>(); List <IntVec3> landCells = new List <IntVec3>(); Log.Message("[Map Designer] Creating multiple islands"); if (MapDesignerMod.mod.settings.priMultiSpawn) { Log.Message("[Map Designer] Island Multispawn"); outerRadius /= 2; innerRadius /= 2; //beachSize /= 2; List <CircleDef> islandList = new List <CircleDef>(); islandList.Add(new CircleDef(center, outerRadius)); CircleDef circle = new CircleDef(center, outerRadius); islandList = GenNestedCircles(circle, islandList); List <CircleDef> finalIslands = new List <CircleDef>(); islandList = islandList.OrderByDescending(ci => ci.Radius).ToList(); foreach (CircleDef c in islandList) { if (c.Radius > 3) { if (c.Center.DistanceToEdge(map) >= 15) { List <IntVec3> newCells = HelperMethods.GenCircle(map, c.Center, c.Radius); if (!newCells.Intersect(beachCells).Any()) { finalIslands.Add(c); beachCells.AddRange(HelperMethods.GenCircle(map, c.Center, c.Radius)); } } } } foreach (CircleDef f in finalIslands) { if (f.Radius > beachSize * 2) { landCells.AddRange(HelperMethods.GenCircle(map, f.Center, f.Radius - beachSize)); beachCells = beachCells.Except(HelperMethods.GenCircle(map, f.Center, f.Radius - beachSize)).ToList(); } } } else { Log.Message("[Map Designer] Creating single island"); landCells = HelperMethods.GenCircle(map, center, innerRadius); beachCells = HelperMethods.GenCircle(map, center, outerRadius).Except(landCells).ToList(); } MapGenFloatGrid elevation = MapGenerator.Elevation; MapGenFloatGrid fertility = MapGenerator.Fertility; List <IntVec3> waterCells = map.AllCells.Except(landCells).Except(beachCells).ToList(); foreach (IntVec3 current in beachCells) { fertility[current] = -1075f; elevation[current] = 0; } foreach (IntVec3 current in waterCells) { fertility[current] = -2025f; elevation[current] = 0; } }
// Main... public ElasticBody() { // Bottom static body { PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 2.0f); sd.Friction = 0.1f; sd.Restitution = 0.1f; BodyDef bd = new BodyDef(); bd.Position.Set(-1.0f, -7.5f); _ground = _world.CreateBody(bd); _ground.CreateShape(sd); } // Upper static body { PolygonDef sd = new PolygonDef(); sd.SetAsBox(20.0f, 0.50f, new Vec2(0.0f, 0.0f), 0.047f * Box2DX.Common.Settings.Pi); sd.Friction = 0.01f; sd.Restitution = 0.001f; BodyDef bd = new BodyDef(); bd.Position.Set(-20.0f, 93.0f); Body g = _world.CreateBody(bd); g.CreateShape(sd); sd.SetAsBox(15.0f, 0.50f, new Vec2(-15.0f, 12.5f), 0.0f); g.CreateShape(sd); sd.SetAsBox(20.0f, 0.5f, new Vec2(0.0f, -25.0f), -0.5f); g.CreateShape(sd); } // Left channel left wall { PolygonDef sd = new PolygonDef(); sd.SetAsBox(0.7f, 55.0f); sd.Friction = 0.1f; sd.Restitution = 0.1f; BodyDef bd = new BodyDef(); bd.Position.Set(-49.3f, 50.0f); Body g = _world.CreateBody(bd); g.CreateShape(sd); } // Right wall { PolygonDef sd = new PolygonDef(); sd.SetAsBox(0.7f, 55.0f); sd.Friction = 0.1f; sd.Restitution = 0.1f; BodyDef bd = new BodyDef(); bd.Position.Set(45.0f, 50.0f); Body g = _world.CreateBody(bd); g.CreateShape(sd); } // Left channel right upper wall { PolygonDef sd = new PolygonDef(); sd.SetAsBox(0.5f, 20.0f); sd.Friction = 0.05f; sd.Restitution = 0.01f; BodyDef bd = new BodyDef(); bd.Position.Set(-42.0f, 70.0f); bd.Angle = -0.03f * Box2DX.Common.Settings.Pi; Body g = _world.CreateBody(bd); g.CreateShape(sd); } // Left channel right lower wall { PolygonDef sd = new PolygonDef(); sd.SetAsBox(0.50f, 23.0f); sd.Friction = 0.05f; sd.Restitution = 0.01f; BodyDef bd = new BodyDef(); bd.Position.Set(-44.0f, 27.0f); Body g = _world.CreateBody(bd); g.CreateShape(sd); // Bottom motors CircleDef cd = new CircleDef(); cd.Radius = 3.0f; cd.Density = 15.0f; cd.Friction = 1.0f; cd.Restitution = 0.2f; // 1. bd.Position.Set(-40.0f, 2.5f); Body body = _world.CreateBody(bd); body.CreateShape(cd); body.SetMassFromShapes(); RevoluteJointDef jr = new RevoluteJointDef(); jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f)); jr.MaxMotorTorque = 30000.0f; jr.EnableMotor = true; jr.MotorSpeed = 20.0f; _world.CreateJoint(jr); // 1. left down bd.Position.Set(-46.0f, -2.5f); cd.Radius = 1.5f; jr.MotorSpeed = -20.0f; body = _world.CreateBody(bd); body.CreateShape(cd); sd.SetAsBox(2.0f, 0.50f); body.CreateShape(sd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter()); _world.CreateJoint(jr); // 2. cd.Radius = 3.0f; jr.MotorSpeed = 20.0f; bd.Position.Set(-32.0f, 2.5f); body = _world.CreateBody(bd); body.CreateShape(cd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f)); _world.CreateJoint(jr); // 3. jr.MotorSpeed = 20.0f; bd.Position.Set(-24.0f, 1.5f); body = _world.CreateBody(bd); body.CreateShape(cd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f)); _world.CreateJoint(jr); // 4. bd.Position.Set(-16.0f, 0.8f); body = _world.CreateBody(bd); body.CreateShape(cd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f)); _world.CreateJoint(jr); // 5. bd.Position.Set(-8.0f, 0.5f); body = _world.CreateBody(bd); body.CreateShape(cd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f)); _world.CreateJoint(jr); // 6. bd.Position.Set(0.0f, 0.1f); body = _world.CreateBody(bd); body.CreateShape(cd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f)); _world.CreateJoint(jr); // 7. bd.Position.Set(8.0f, -0.5f); body = _world.CreateBody(bd); body.CreateShape(cd); sd.SetAsBox(3.7f, 0.5f); body.CreateShape(sd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter() + new Vec2(0.0f, 1.0f)); _world.CreateJoint(jr); // 8. right rotator sd.SetAsBox(5.0f, 0.5f); sd.Density = 2.0f; bd.Position.Set(18.0f, 1.0f); Body rightmotor = _world.CreateBody(bd); rightmotor.CreateShape(sd); sd.SetAsBox(4.5f, 0.5f, new Vec2(0.0f, 0.0f), Box2DX.Common.Settings.Pi / 3.0f); rightmotor.CreateShape(sd); sd.SetAsBox(4.5f, 0.5f, new Vec2(0.0f, 0.0f), Box2DX.Common.Settings.Pi * 2.0f / 3.0f); rightmotor.CreateShape(sd); cd.Radius = 4.2f; rightmotor.CreateShape(cd); rightmotor.SetMassFromShapes(); jr.Initialize(g, rightmotor, rightmotor.GetWorldCenter()); jr.MaxMotorTorque = 70000.0f; jr.MotorSpeed = -4.0f; _world.CreateJoint(jr); // 9. left rotator sd.SetAsBox(8.5f, 0.5f); sd.Density = 2.0f; bd.Position.Set(-34.0f, 17.0f); body = _world.CreateBody(bd); body.CreateShape(sd); sd.SetAsBox(8.5f, 0.5f, new Vec2(0.0f, 0.0f), Box2DX.Common.Settings.Pi * .5f); body.CreateShape(sd); cd.Radius = 7.0f; cd.Friction = 0.9f; body.CreateShape(cd); body.SetMassFromShapes(); jr.Initialize(g, body, body.GetWorldCenter()); jr.MaxMotorTorque = 100000.0f; jr.MotorSpeed = -5.0f; _world.CreateJoint(jr); // big compressor sd.SetAsBox(3.0f, 4.0f); sd.Density = 10.0f; bd.Position.Set(-16.0f, 17.0f); Body hammerleft = _world.CreateBody(bd); hammerleft.CreateShape(sd); hammerleft.SetMassFromShapes(); DistanceJointDef jd = new DistanceJointDef(); jd.Initialize(body, hammerleft, body.GetWorldCenter() + new Vec2(0.0f, 6.0f), hammerleft.GetWorldCenter()); _world.CreateJoint(jd); bd.Position.Set(4.0f, 17.0f); Body hammerright = _world.CreateBody(bd); hammerright.CreateShape(sd); hammerright.SetMassFromShapes(); jd.Initialize(body, hammerright, body.GetWorldCenter() - new Vec2(0.0f, 6.0f), hammerright.GetWorldCenter()); _world.CreateJoint(jd); // pusher sd.SetAsBox(6.0f, 0.75f); bd.Position.Set(-21.0f, 9.0f); Body pusher = _world.CreateBody(bd); pusher.CreateShape(sd); sd.SetAsBox(2.0f, 1.5f, new Vec2(-5.0f, 0.0f), 0.0f); pusher.SetMassFromShapes(); pusher.CreateShape(sd); jd.Initialize(rightmotor, pusher, rightmotor.GetWorldCenter() + new Vec2(-8.0f, 0.0f), pusher.GetWorldCenter() + new Vec2(5.0f, 0.0f)); _world.CreateJoint(jd); } // Static bodies above motors { PolygonDef sd = new PolygonDef(); CircleDef cd = new CircleDef(); sd.SetAsBox(9.0f, 0.5f); sd.Friction = 0.05f; sd.Restitution = 0.01f; BodyDef bd = new BodyDef(); bd.Position.Set(-15.5f, 12.0f); bd.Angle = 0.0f; Body g = _world.CreateBody(bd); g.CreateShape(sd); sd.SetAsBox(8.0f, 0.5f, new Vec2(23.0f, 0.0f), 0.0f); g.CreateShape(sd); // compressor statics sd.SetAsBox(7.0f, 0.5f, new Vec2(-2.0f, 9.0f), 0.0f); g.CreateShape(sd); sd.SetAsBox(9.0f, 0.5f, new Vec2(22.0f, 9.0f), 0.0f); g.CreateShape(sd); sd.SetAsBox(19.0f, 0.5f, new Vec2(-9.0f, 15.0f), -0.05f); g.CreateShape(sd); sd.SetAsBox(4.7f, 0.5f, new Vec2(15.0f, 11.5f), -0.5f); g.CreateShape(sd); // below compressor sd.SetAsBox(26.0f, 0.3f, new Vec2(17.0f, -4.4f), -0.02f); g.CreateShape(sd); cd.Radius = 1.0f; cd.Friction = 1.0f; cd.LocalPosition = new Vec2(29.0f, -6.0f); g.CreateShape(cd); cd.Radius = 0.7f; cd.LocalPosition = new Vec2(-2.0f, -4.5f); g.CreateShape(cd); } // Elevator { BodyDef bd = new BodyDef(); CircleDef cd = new CircleDef(); PolygonDef sd = new PolygonDef(); bd.Position.Set(40.0f, 4.0f); _elev = _world.CreateBody(bd); sd.SetAsBox(0.5f, 2.5f, new Vec2(3.0f, -3.0f), 0.0f); sd.Density = 1.0f; sd.Friction = 0.01f; _elev.CreateShape(sd); sd.SetAsBox(7.0f, 0.5f, new Vec2(-3.5f, -5.5f), 0.0f); _elev.CreateShape(sd); sd.SetAsBox(0.5f, 2.5f, new Vec2(-11.0f, -3.5f), 0.0f); _elev.CreateShape(sd); _elev.SetMassFromShapes(); PrismaticJointDef jp = new PrismaticJointDef(); jp.Initialize(_ground, _elev, bd.Position, new Vec2(0.0f, 1.0f)); jp.LowerTranslation = 0.0f; jp.UpperTranslation = 100.0f; jp.EnableLimit = true; jp.EnableMotor = true; jp.MaxMotorForce = 10000.0f; jp.MotorSpeed = 0.0f; _joint_elev = (PrismaticJoint)_world.CreateJoint(jp); // Korb sd.SetAsBox(2.3f, 0.5f, new Vec2(1.0f, 0.0f), 0.0f); sd.Density = 0.5f; bd.Position.Set(29.0f, 6.5f); Body body = _world.CreateBody(bd); body.CreateShape(sd); sd.SetAsBox(2.5f, 0.5f, new Vec2(3.0f, -2.0f), Box2DX.Common.Settings.Pi / 2.0f); body.CreateShape(sd); sd.SetAsBox(4.6f, 0.5f, new Vec2(7.8f, -4.0f), 0.0f); body.CreateShape(sd); sd.SetAsBox(0.5f, 4.5f, new Vec2(12.0f, 0.0f), 0.0f); body.CreateShape(sd); sd.SetAsBox(0.5f, 0.5f, new Vec2(13.0f, 4.0f), 0.0f); body.CreateShape(sd); cd.Radius = 0.7f; cd.Density = 1.0f; cd.Friction = 0.01f; cd.LocalPosition = new Vec2(0.0f, 0.0f); body.CreateShape(cd); body.SetMassFromShapes(); RevoluteJointDef jr = new RevoluteJointDef(); jr.Initialize(_elev, body, bd.Position); jr.EnableLimit = true; jr.LowerAngle = -0.2f; jr.UpperAngle = Box2DX.Common.Settings.Pi * 1.1f; jr.CollideConnected = true; _world.CreateJoint(jr); // upper body exit sd.SetAsBox(14.0f, 0.5f, new Vec2(-3.5f, -10.0f), 0.0f); bd.Position.Set(17.5f, 96.0f); body = _world.CreateBody(bd); body.CreateShape(sd); } // "Elastic body" 64 bodies - something like a lin. elastic compound // connected via dynamic forces (springs) { PolygonDef sd = new PolygonDef(); sd.SetAsBox(0.55f, 0.55f); sd.Density = 1.5f; sd.Friction = 0.01f; sd.Filter.GroupIndex = -1; Vec2 startpoint = new Vec2(30.0f, 20.0f); BodyDef bd = new BodyDef(); bd.IsBullet = false; bd.AllowSleep = false; for (int i = 0; i < 8; ++i) { for (int j = 0; j < 8; ++j) { bd.Position.Set(j * 1.02f, 2.51f + 1.02f * i); bd.Position += startpoint; Body body = _world.CreateBody(bd); bodies[8 * i + j] = body; body.CreateShape(sd); body.SetMassFromShapes(); } } } }
public Gears() { Body ground = null; { BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, -10.0f); ground = _world.CreateBody(bd); PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 10.0f); ground.CreateShape(sd); } { CircleDef circle1 = new CircleDef(); circle1.Radius = 1.0f; circle1.Density = 5.0f; CircleDef circle2 = new CircleDef(); circle2.Radius = 2.0f; circle2.Density = 5.0f; PolygonDef box = new PolygonDef(); box.SetAsBox(0.5f, 5.0f); box.Density = 5.0f; BodyDef bd1 = new BodyDef(); bd1.Position.Set(-3.0f, 12.0f); Body body1 = _world.CreateBody(bd1); body1.CreateShape(circle1); body1.SetMassFromShapes(); RevoluteJointDef jd1 = new RevoluteJointDef(); jd1.Body1 = ground; jd1.Body2 = body1; jd1.LocalAnchor1 = ground.GetLocalPoint(bd1.Position); jd1.LocalAnchor2 = body1.GetLocalPoint(bd1.Position); jd1.ReferenceAngle = body1.GetAngle() - ground.GetAngle(); _joint1 = (RevoluteJoint)_world.CreateJoint(jd1); BodyDef bd2 = new BodyDef(); bd2.Position.Set(0.0f, 12.0f); Body body2 = _world.CreateBody(bd2); body2.CreateShape(circle2); body2.SetMassFromShapes(); RevoluteJointDef jd2 = new RevoluteJointDef(); jd2.Initialize(ground, body2, bd2.Position); _joint2 = (RevoluteJoint)_world.CreateJoint(jd2); BodyDef bd3 = new BodyDef(); bd3.Position.Set(2.5f, 12.0f); Body body3 = _world.CreateBody(bd3); body3.CreateShape(box); body3.SetMassFromShapes(); PrismaticJointDef jd3 = new PrismaticJointDef(); jd3.Initialize(ground, body3, bd3.Position, new Vec2(0.0f, 1.0f)); jd3.LowerTranslation = -5.0f; jd3.UpperTranslation = 5.0f; jd3.EnableLimit = true; _joint3 = (PrismaticJoint)_world.CreateJoint(jd3); GearJointDef jd4 = new GearJointDef(); jd4.Body1 = body1; jd4.Body2 = body2; jd4.Joint1 = _joint1; jd4.Joint2 = _joint2; jd4.Ratio = circle2.Radius / circle1.Radius; _joint4 = (GearJoint)_world.CreateJoint(jd4); GearJointDef jd5 = new GearJointDef(); jd5.Body1 = body2; jd5.Body2 = body3; jd5.Joint1 = _joint2; jd5.Joint2 = _joint3; jd5.Ratio = -1.0f / circle2.Radius; _joint5 = (GearJoint)_world.CreateJoint(jd5); } }
public CompoundShapes() { { BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, -10.0f); Body body = _world.CreateBody(bd); PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 10.0f); body.CreateShape(sd); } { CircleDef sd1 = new CircleDef(); sd1.Radius = 0.5f; sd1.LocalPosition.Set(-0.5f, 0.5f); sd1.Density = 2.0f; CircleDef sd2 = new CircleDef(); sd2.Radius = 0.5f; sd2.LocalPosition.Set(0.5f, 0.5f); sd2.Density = 0.0f; // massless for (int i = 0; i < 10; ++i) { float x = Box2DX.Common.Math.Random(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.Position.Set(x + 5.0f, 1.05f + 2.5f * i); bd.Angle = Box2DX.Common.Math.Random(-Box2DX.Common.Settings.Pi, Box2DX.Common.Settings.Pi); Body body = _world.CreateBody(bd); body.CreateShape(sd1); body.CreateShape(sd2); body.SetMassFromShapes(); } } { PolygonDef sd1 = new PolygonDef(); sd1.SetAsBox(0.25f, 0.5f); sd1.Density = 2.0f; PolygonDef sd2 = new PolygonDef(); sd2.SetAsBox(0.25f, 0.5f, new Vec2(0.0f, -0.5f), 0.5f * Box2DX.Common.Settings.Pi); sd2.Density = 2.0f; for (int i = 0; i < 10; ++i) { float x = Box2DX.Common.Math.Random(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.Position.Set(x - 5.0f, 1.05f + 2.5f * i); bd.Angle = Box2DX.Common.Math.Random(-Box2DX.Common.Settings.Pi, Box2DX.Common.Settings.Pi); Body body = _world.CreateBody(bd); body.CreateShape(sd1); body.CreateShape(sd2); body.SetMassFromShapes(); } } { XForm xf1 = new XForm(); xf1.R.Set(0.3524f * Box2DX.Common.Settings.Pi); xf1.Position = Box2DX.Common.Math.Mul(xf1.R, new Vec2(1.0f, 0.0f)); PolygonDef sd1 = new PolygonDef(); sd1.VertexCount = 3; sd1.Vertices[0] = Box2DX.Common.Math.Mul(xf1, new Vec2(-1.0f, 0.0f)); sd1.Vertices[1] = Box2DX.Common.Math.Mul(xf1, new Vec2(1.0f, 0.0f)); sd1.Vertices[2] = Box2DX.Common.Math.Mul(xf1, new Vec2(0.0f, 0.5f)); sd1.Density = 2.0f; XForm xf2 = new XForm(); xf2.R.Set(-0.3524f * Box2DX.Common.Settings.Pi); xf2.Position = Box2DX.Common.Math.Mul(xf2.R, new Vec2(-1.0f, 0.0f)); PolygonDef sd2 = new PolygonDef(); sd2.VertexCount = 3; sd2.Vertices[0] = Box2DX.Common.Math.Mul(xf2, new Vec2(-1.0f, 0.0f)); sd2.Vertices[1] = Box2DX.Common.Math.Mul(xf2, new Vec2(1.0f, 0.0f)); sd2.Vertices[2] = Box2DX.Common.Math.Mul(xf2, new Vec2(0.0f, 0.5f)); sd2.Density = 2.0f; for (int i = 0; i < 10; ++i) { float x = Box2DX.Common.Math.Random(-0.1f, 0.1f); BodyDef bd = new BodyDef(); bd.Position.Set(x, 2.05f + 2.5f * i); bd.Angle = 0.0f; Body body = _world.CreateBody(bd); body.CreateShape(sd1); body.CreateShape(sd2); body.SetMassFromShapes(); } } { PolygonDef sd_bottom = new PolygonDef(); sd_bottom.SetAsBox(1.5f, 0.15f); sd_bottom.Density = 4.0f; PolygonDef sd_left = new PolygonDef(); sd_left.SetAsBox(0.15f, 2.7f, new Vec2(-1.45f, 2.35f), 0.2f); sd_left.Density = 4.0f; PolygonDef sd_right = new PolygonDef(); sd_right.SetAsBox(0.15f, 2.7f, new Vec2(1.45f, 2.35f), -0.2f); sd_right.Density = 4.0f; BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, 2.0f); Body body = _world.CreateBody(bd); body.CreateShape(sd_bottom); body.CreateShape(sd_left); body.CreateShape(sd_right); body.SetMassFromShapes(); } }
public CollisionProcessing() { // Ground body { PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 10.0f); sd.Friction = 0.3f; BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, -10.0f); Body ground = _world.CreateBody(bd); ground.CreateShape(sd); } float xLo = -5.0f, xHi = 5.0f; float yLo = 2.0f, yHi = 35.0f; // Small triangle PolygonDef triangleShapeDef = new PolygonDef(); triangleShapeDef.VertexCount = 3; triangleShapeDef.Vertices[0].Set(-1.0f, 0.0f); triangleShapeDef.Vertices[1].Set(1.0f, 0.0f); triangleShapeDef.Vertices[2].Set(0.0f, 2.0f); triangleShapeDef.Density = 1.0f; BodyDef triangleBodyDef = new BodyDef(); //triangleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi)); triangleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 35f); Body body1 = _world.CreateBody(triangleBodyDef); body1.CreateShape(triangleShapeDef); body1.SetMassFromShapes(); // Large triangle (recycle definitions) triangleShapeDef.Vertices[0] *= 2.0f; triangleShapeDef.Vertices[1] *= 2.0f; triangleShapeDef.Vertices[2] *= 2.0f; //triangleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi)); triangleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 30f); Body body2 = _world.CreateBody(triangleBodyDef); body2.CreateShape(triangleShapeDef); body2.SetMassFromShapes(); // Small box PolygonDef boxShapeDef = new PolygonDef(); boxShapeDef.SetAsBox(1.0f, 0.5f); boxShapeDef.Density = 1.0f; BodyDef boxBodyDef = new BodyDef(); //boxBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi)); boxBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 25f); Body body3 = _world.CreateBody(boxBodyDef); body3.CreateShape(boxShapeDef); body3.SetMassFromShapes(); // Large box (recycle definitions) boxShapeDef.SetAsBox(2.0f, 1.0f); //boxBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi)); boxBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 15f); Body body4 = _world.CreateBody(boxBodyDef); body4.CreateShape(boxShapeDef); body4.SetMassFromShapes(); // Small circle CircleDef circleShapeDef = new CircleDef(); circleShapeDef.Radius = 1.0f; circleShapeDef.Density = 1.0f; BodyDef circleBodyDef = new BodyDef(); //circleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi)); circleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 10f); Body body5 = _world.CreateBody(circleBodyDef); body5.CreateShape(circleShapeDef); body5.SetMassFromShapes(); // Large circle circleShapeDef.Radius *= 2.0f; //circleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), Box2DX.Common.Math.Random(yLo, yHi)); circleBodyDef.Position.Set(Box2DX.Common.Math.Random(xLo, xHi), 5f); Body body6 = _world.CreateBody(circleBodyDef); body6.CreateShape(circleShapeDef); body6.SetMassFromShapes(); }
public Dominos() { Body b1; { PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 10.0f); BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, -10.0f); b1 = _world.CreateBody(bd); b1.CreateShape(sd); } { PolygonDef sd = new PolygonDef(); sd.SetAsBox(6.0f, 0.25f); BodyDef bd = new BodyDef(); bd.Position.Set(-1.5f, 10.0f); Body ground = _world.CreateBody(bd); ground.CreateShape(sd); } { PolygonDef sd = new PolygonDef(); sd.SetAsBox(0.1f, 1.0f); sd.Density = 20.0f; sd.Friction = 0.1f; for (int i = 0; i < 10; ++i) { BodyDef bd = new BodyDef(); bd.Position.Set(-6.0f + 1.0f * i, 11.25f); Body body = _world.CreateBody(bd); body.CreateShape(sd); body.SetMassFromShapes(); } } { PolygonDef sd = new PolygonDef(); sd.SetAsBox(7.0f, 0.25f, Vec2.Zero, 0.3f); BodyDef bd = new BodyDef(); bd.Position.Set(1.0f, 6.0f); Body ground = _world.CreateBody(bd); ground.CreateShape(sd); } Body b2; { PolygonDef sd = new PolygonDef(); sd.SetAsBox(0.25f, 1.5f); BodyDef bd = new BodyDef(); bd.Position.Set(-7.0f, 4.0f); b2 = _world.CreateBody(bd); b2.CreateShape(sd); } Body b3; { PolygonDef sd = new PolygonDef(); sd.SetAsBox(6.0f, 0.125f); sd.Density = 10.0f; BodyDef bd = new BodyDef(); bd.Position.Set(-0.9f, 1.0f); bd.Angle = -0.15f; b3 = _world.CreateBody(bd); b3.CreateShape(sd); b3.SetMassFromShapes(); } RevoluteJointDef jd = new RevoluteJointDef(); Vec2 anchor = new Vec2(); anchor.Set(-2.0f, 1.0f); jd.Initialize(b1, b3, anchor); jd.CollideConnected = true; _world.CreateJoint(jd); Body b4; { PolygonDef sd = new PolygonDef(); sd.SetAsBox(0.25f, 0.25f); sd.Density = 10.0f; BodyDef bd = new BodyDef(); bd.Position.Set(-10.0f, 15.0f); b4 = _world.CreateBody(bd); b4.CreateShape(sd); b4.SetMassFromShapes(); } anchor.Set(-7.0f, 15.0f); jd.Initialize(b2, b4, anchor); _world.CreateJoint(jd); Body b5; { BodyDef bd = new BodyDef(); bd.Position.Set(6.5f, 3.0f); b5 = _world.CreateBody(bd); PolygonDef sd = new PolygonDef(); sd.Density = 10.0f; sd.Friction = 0.1f; sd.SetAsBox(1.0f, 0.1f, new Vec2(0.0f, -0.9f), 0.0f); b5.CreateShape(sd); sd.SetAsBox(0.1f, 1.0f, new Vec2(-0.9f, 0.0f), 0.0f); b5.CreateShape(sd); sd.SetAsBox(0.1f, 1.0f, new Vec2(0.9f, 0.0f), 0.0f); b5.CreateShape(sd); b5.SetMassFromShapes(); } anchor.Set(6.0f, 2.0f); jd.Initialize(b1, b5, anchor); _world.CreateJoint(jd); Body b6; { PolygonDef sd = new PolygonDef(); sd.SetAsBox(1.0f, 0.1f); sd.Density = 30.0f; sd.Friction = 0.2f; BodyDef bd = new BodyDef(); bd.Position.Set(6.5f, 4.1f); b6 = _world.CreateBody(bd); b6.CreateShape(sd); b6.SetMassFromShapes(); } anchor.Set(7.5f, 4.0f); jd.Initialize(b5, b6, anchor); _world.CreateJoint(jd); Body b7; { PolygonDef sd = new PolygonDef(); sd.SetAsBox(0.1f, 1.0f); sd.Density = 10.0f; BodyDef bd = new BodyDef(); bd.Position.Set(7.4f, 1.0f); b7 = _world.CreateBody(bd); b7.CreateShape(sd); b7.SetMassFromShapes(); } DistanceJointDef djd = new DistanceJointDef(); djd.Body1 = b3; djd.Body2 = b7; djd.LocalAnchor1.Set(6.0f, 0.0f); djd.LocalAnchor2.Set(0.0f, -1.0f); Vec2 d = djd.Body2.GetWorldPoint(djd.LocalAnchor2) - djd.Body1.GetWorldPoint(djd.LocalAnchor1); djd.Length = d.Length(); _world.CreateJoint(djd); { CircleDef sd = new CircleDef(); sd.Radius = 0.2f; sd.Density = 10.0f; for (int i = 0; i < 4; ++i) { BodyDef bd = new BodyDef(); bd.Position.Set(5.9f + 2.0f * sd.Radius * i, 2.4f); Body body = _world.CreateBody(bd); body.CreateShape(sd); body.SetMassFromShapes(); } } }
List<Vec2> vertices = new List<Vec2>(); // we need this for drawing between the vertices #endregion Fields #region Constructors /** * Creates a new drawn object */ public PaintedObject(World world, string blobtexturename, string segmenttexturename, List<Vector2> unsanitized_blobs) : base(world, blobtexturename, POB_DENSITY, POB_FRICTION, POB_RESTITUTION, 1f) { List<Vector2> blobs = SanitizeBlobs(unsanitized_blobs); if (blobs.Count == 0) return; Position = blobs[0]; // CASSWorld.SCALE; // position of the painting is the first blob in it Texture2D segmenttexture = GameEngine.TextureList[segmenttexturename]; Texture2D blobtexture = GameEngine.TextureList[blobtexturename]; this.blobTextureName = blobtexturename; this.segmentTextureName = segmenttexturename; TextureFilename = segmenttexturename; //boundingBox = new Rectangle((int)Position.X, (int)Position.Y, (int)Height, (int)Width); segmentTexture = segmenttexture; blobTexture = blobtexture; radius = (float)(blobtexture.Width) / (2 * CASSWorld.SCALE); //radius = (float)(blobtexture.Width - 6) / (2 * CASSWorld.SCALE); //radius = 4 / CASSWorld.SCALE; // really small physics object to keep cosmo from stubbing his toes // calculate amount of instasteel that was taken from this object during sanitation so we can return it to you float origamount = 0; for (int i = 0; i < unsanitized_blobs.Count - 1; i++) { origamount += Vector2.Distance(unsanitized_blobs[i], unsanitized_blobs[i + 1]) * CASSWorld.SCALE; } //foreach (Vector2 blobpos in blobs) for (int i=0; i<blobs.Count-1; i++) { // Vector2 localpos = (blobs[i] / CASSWorld.SCALE) - Position; //Vector2 localpos2 = (blobs[i+1] / CASSWorld.SCALE) - Position; Vector2 localpos = blobs[i] - Position; Vector2 localpos2 = blobs[i+1]- Position; amountOfInstasteel += Vector2.Distance(blobs[i], blobs[i + 1]) * CASSWorld.SCALE; // moved above // add a circle fixture to this object at each point CircleDef circle = new CircleDef(); circle.LocalPosition = Common.Utils.Convert(localpos); circle.Radius = radius; circle.Density = POB_DENSITY; circle.Friction = POB_FRICTION; circle.Restitution = POB_RESTITUTION; shapes.Add(circle); float scaledTextureWidth = segmentTexture.Width / CASSWorld.SCALE; Vector2 shapeVec = localpos2 - localpos; shapeVec.Normalize(); Vector2 cornerOrtho = new Vector2(-shapeVec.Y, shapeVec.X);// * segmentTexture.Width / 2; // manually calculate the positions of each corner of the box/line between localpos and localpos2 Vector2[] cornerpoints = new Vector2[] { // if box were lying flat... localpos - cornerOrtho * scaledTextureWidth / 2, // lower-left corner localpos2 - cornerOrtho * scaledTextureWidth / 2, // lower-right corner localpos2 + cornerOrtho * scaledTextureWidth / 2, // upper-right corner localpos + cornerOrtho * scaledTextureWidth / 2 // upper-left corner }; LinkedList<int> polygon = new LinkedList<int>(); for (int j = 0; j < cornerpoints.Length; j++) polygon.AddLast(j); // Triangles generated List<Vector2[]> triangles = new List<Vector2[]>(); Split(polygon, cornerpoints, triangles); CreateShapes(triangles, POB_DENSITY, POB_FRICTION, POB_RESTITUTION); vertices.Add(Common.Utils.Convert(localpos)); // that is, vertices of the curve approximation numBlobs++; } // return the instasteel that was taken from you during sanitation of your drawing ScrollingWorld.numDrawLeft += (origamount - amountOfInstasteel); // add the last vertex //Vector2 lastlocalpos = (blobs[blobs.Count - 1] / CASSWorld.SCALE) - Position; //vertices.Add(Common.Utils.Convert(lastlocalpos)); Vector2 lastlocalpos = blobs[blobs.Count - 1]- Position; vertices.Add(Utils.Convert(lastlocalpos)); numBlobs++; }
public TheoJansen() { _offset.Set(0.0f, 8.0f); _motorSpeed = 2.0f; _motorOn = true; Vec2 pivot = new Vec2(0.0f, 0.8f); { PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 10.0f); BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, -10.0f); Body ground = _world.CreateBody(bd); ground.CreateShape(sd); sd.SetAsBox(0.5f, 5.0f, new Vec2(-50.0f, 15.0f), 0.0f); ground.CreateShape(sd); sd.SetAsBox(0.5f, 5.0f, new Vec2(50.0f, 15.0f), 0.0f); ground.CreateShape(sd); } for (int i = 0; i < 40; ++i) { CircleDef sd = new CircleDef(); sd.Density = 1.0f; sd.Radius = 0.25f; BodyDef bd = new BodyDef(); bd.Position.Set(-40.0f + 2.0f * i, 0.5f); Body body = _world.CreateBody(bd); body.CreateShape(sd); body.SetMassFromShapes(); } { PolygonDef sd = new PolygonDef(); sd.Density = 1.0f; sd.SetAsBox(2.5f, 1.0f); sd.Filter.GroupIndex = -1; BodyDef bd = new BodyDef(); bd.Position = pivot + _offset; _chassis = _world.CreateBody(bd); _chassis.CreateShape(sd); _chassis.SetMassFromShapes(); } { CircleDef sd = new CircleDef(); sd.Density = 1.0f; sd.Radius = 1.6f; sd.Filter.GroupIndex = -1; BodyDef bd = new BodyDef(); bd.Position = pivot + _offset; _wheel = _world.CreateBody(bd); _wheel.CreateShape(sd); _wheel.SetMassFromShapes(); } { 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); } Vec2 wheelAnchor; wheelAnchor = pivot + new Vec2(0.0f, -0.8f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); _wheel.SetXForm(_wheel.GetPosition(), 120.0f * Box2DX.Common.Settings.Pi / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); _wheel.SetXForm(_wheel.GetPosition(), -120.0f * Box2DX.Common.Settings.Pi / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); }
public override void Keyboard(System.Windows.Forms.Keys key) { switch (key) { case System.Windows.Forms.Keys.S: if (_bullet != null) { _world.DestroyBody(_bullet); _bullet = null; } { CircleDef sd = new CircleDef(); sd.Density = 20.0f; sd.Radius = 0.25f; sd.Restitution = 0.05f; BodyDef bd = new BodyDef(); bd.IsBullet = true; bd.AllowSleep = false; bd.Position.Set(-31.0f, 5.0f); _bullet = _world.CreateBody(bd); _bullet.CreateShape(sd); _bullet.SetMassFromShapes(); _bullet.SetLinearVelocity(new Vec2(400.0f, 0.0f)); } break; } }
public virtual void InitPhysics() { if (_physBody != null) { Log.Instance.Log("WARNING: Call to InitPhysics had no effect. Actor has already had physics initialized."); return; } ShapeType shapeType = ShapeType.Box; Box2D.World physicsWorld = Angel.World.Instance.PhysicsWorld; ShapeDef shape; switch (shapeType) { case ShapeType.Box: PolygonDef box = new PolygonDef(); box.SetAsBox(0.5f * Size.X, 0.5f * Size.Y); shape = box; break; case ShapeType.Circle: CircleDef circle = new CircleDef(); circle.Radius = 0.5f * Size.X; shape = circle; break; default: Log.Instance.Log("InitPhysics(): Invalid shape type given"); return; } shape.Density = _fDensity; shape.Friction = _fFriction; shape.Restitution = _fRestitution; shape.IsSensor = _bIsSensor; if (_iCollisionFlags != -1) { //shape->maskBits = (short)collisionFlags; //shape->categoryBits = (short)collisionFlags; } // InitShape( shape ); BodyDef bodyDef = new BodyDef(); bodyDef.UserData = this; bodyDef.Position = this.Position; bodyDef.Angle = MathHelper.ToRadians(-Rotation); bodyDef.FixedRotation = _bFixedRotation; _physBody = physicsWorld.CreateBody(bodyDef); _physBody.CreateShape(shape); _physBody.SetMassFromShapes(); CustomInitPhysics(); }
public PlayerCharacter(World _world, Vector2 _position) : base(_world, _position) { playerIndex = playerCount++; color = PlayerCharacter.Colors[playerIndex]; accelerate = 0; rotate = 0; isDead = false; this.angVelocity = 0; //build the unicycle CircleDef circleDef = new CircleDef(); circleDef.Radius = 1; circleDef.Density = 1f; circleDef.Friction = 1.0f; circleDef.Restitution = 0.0f; circleDef.LocalPosition.Set(0, 0); wheel = body.CreateShape(circleDef); body.SetMassFromShapes(); body.SetUserData(this); // link body and this to register collisions in this //build the head and connect with the wheel BodyDef bodydef = new BodyDef(); bodydef.Position = _position + new Vector2(0.0f, 3.5f); bodydef.Angle = 0f; chest = _world.CreateBody(bodydef); //add the head circleDef.Density = 0.0001f; circleDef.Radius = 0.75f; circleDef.LocalPosition.Set(0, 3); head = chest.CreateShape(circleDef); rotationHead = _position; PolygonDef Boxdef = new PolygonDef(); Boxdef.SetAsBox(1, 1.5f); Boxdef.Density = 0.25f; Boxdef.Friction = 0.4f; Box2DX.Collision.Shape s2 = chest.CreateShape(Boxdef); chest.SetMassFromShapes(); chest.SetUserData(this); //Jointshit RevoluteJointDef jointDefKW = new RevoluteJointDef(); jointDefKW.Body2 = chest; jointDefKW.Body1 = body; jointDefKW.CollideConnected = false; jointDefKW.LocalAnchor2 = new Vector2(-0.0f, -3.8f); jointDefKW.LocalAnchor1 = new Vector2(0, 0); jointDefKW.EnableLimit = false; _world.CreateJoint(jointDefKW); // add visuals Texture wheelTexture = AssetManager.getTexture(AssetManager.TextureName.ShoopWheel); wheelSprite = new AnimatedSprite(wheelTexture, 1.0f, 1, (Vector2)wheelTexture.Size); wheelSprite.Scale = Constants.windowScaleFactor * new Vector2(0.2f, 0.2f); //(Vector2.One / (Vector2)wheelTexture.Size * 2F * circleDef.Radius).toScreenCoord() - Vector2.Zero.toScreenCoord();//new Vector2(0.08f, 0.08f); wheelSprite.Origin = ((Vector2)wheelSprite.spriteSize) / 2F; sheepSprite = new Sprite(AssetManager.getTexture(AssetManager.TextureName.ShoopInfronUnicycle)); sheepSprite.Origin = ((Vector2)sheepSprite.Texture.Size) / 2F; sheepSprite.Scale = Constants.windowScaleFactor * new Vector2(_position.X > Constants.worldSizeX / 2F ? -0.2f : 0.2f, 0.2f); }
public Car() { { // car body PolygonDef poly1 = new PolygonDef(), poly2 = new PolygonDef(); // bottom half poly1.VertexCount = 5; poly1.Vertices[4].Set(-2.2f, -0.74f); poly1.Vertices[3].Set(-2.2f, 0); poly1.Vertices[2].Set(1.0f, 0); poly1.Vertices[1].Set(2.2f, -0.2f); poly1.Vertices[0].Set(2.2f, -0.74f); poly1.Filter.GroupIndex = -1; poly1.Density = 20.0f; poly1.Friction = 0.68f; poly1.Filter.GroupIndex = -1; // top half poly2.VertexCount = 4; poly2.Vertices[3].Set(-1.7f, 0); poly2.Vertices[2].Set(-1.3f, 0.7f); poly2.Vertices[1].Set(0.5f, 0.74f); poly2.Vertices[0].Set(1.0f, 0); poly2.Filter.GroupIndex = -1; poly2.Density = 5.0f; poly2.Friction = 0.68f; poly2.Filter.GroupIndex = -1; BodyDef bd = new BodyDef(); bd.Position.Set(-35.0f, 2.8f); _vehicle = _world.CreateBody(bd); _vehicle.CreateShape(poly1); _vehicle.CreateShape(poly2); _vehicle.SetMassFromShapes(); } { // vehicle wheels CircleDef circ = new CircleDef(); circ.Density = 40.0f; circ.Radius = 0.38608f; circ.Friction = 0.8f; circ.Filter.GroupIndex = -1; BodyDef bd = new BodyDef(); bd.AllowSleep = false; bd.Position.Set(-33.8f, 2.0f); _rightWheel = _world.CreateBody(bd); _rightWheel.CreateShape(circ); _rightWheel.SetMassFromShapes(); bd.Position.Set(-36.2f, 2.0f); _leftWheel = _world.CreateBody(bd); _leftWheel.CreateShape(circ); _leftWheel.SetMassFromShapes(); } { // join wheels to chassis Vec2 anchor = new Vec2(); RevoluteJointDef jd = new RevoluteJointDef(); jd.Initialize(_vehicle, _leftWheel, _leftWheel.GetWorldCenter()); jd.CollideConnected = false; jd.EnableMotor = true; jd.MaxMotorTorque = 10.0f; jd.MotorSpeed = 0.0f; _leftJoint = (RevoluteJoint)_world.CreateJoint(jd); jd.Initialize(_vehicle, _rightWheel, _rightWheel.GetWorldCenter()); jd.CollideConnected = false; _rightJoint = (RevoluteJoint)_world.CreateJoint(jd); } { // ground PolygonDef box = new PolygonDef(); box.SetAsBox(19.5f, 0.5f); box.Friction = 0.62f; BodyDef bd = new BodyDef(); bd.Position.Set(-25.0f, 1.0f); Body ground = _world.CreateBody(bd); ground.CreateShape(box); } { // more ground PolygonDef box = new PolygonDef(); BodyDef bd = new BodyDef(); box.SetAsBox(9.5f, 0.5f, Vec2.Zero, 0.1f * Box2DX.Common.Settings.Pi); box.Friction = 0.62f; bd.Position.Set(27.0f - 30.0f, 3.1f); Body ground = _world.CreateBody(bd); ground.CreateShape(box); } { // more ground PolygonDef box = new PolygonDef(); BodyDef bd = new BodyDef(); box.SetAsBox(9.5f, 0.5f, Vec2.Zero, -0.1f * Box2DX.Common.Settings.Pi); box.Friction = 0.62f; bd.Position.Set(55.0f - 30.0f, 3.1f); Body ground = _world.CreateBody(bd); ground.CreateShape(box); } { // more ground PolygonDef box = new PolygonDef(); BodyDef bd = new BodyDef(); box.SetAsBox(9.5f, 0.5f, Vec2.Zero, 0.03f * Box2DX.Common.Settings.Pi); box.Friction = 0.62f; bd.Position.Set(41.0f, 2.0f); Body ground = _world.CreateBody(bd); ground.CreateShape(box); } { // more ground PolygonDef box = new PolygonDef(); BodyDef bd = new BodyDef(); box.SetAsBox(5.0f, 0.5f, Vec2.Zero, 0.15f * Box2DX.Common.Settings.Pi); box.Friction = 0.62f; bd.Position.Set(50.0f, 4.0f); Body ground = _world.CreateBody(bd); ground.CreateShape(box); } { // more ground PolygonDef box = new PolygonDef(); BodyDef bd = new BodyDef(); box.SetAsBox(20.0f, 0.5f); box.Friction = 0.62f; bd.Position.Set(85.0f, 2.0f); Body ground = _world.CreateBody(bd); ground.CreateShape(box); } }
public void LaunchBomb() { if (_bomb != null) { _world.DestroyBody(_bomb); _bomb = null; } BodyDef bd = new BodyDef(); bd.AllowSleep = true; bd.Position.Set(Box2DX.Common.Math.Random(-15.0f, 15.0f), 30.0f); bd.IsBullet = true; _bomb = _world.CreateBody(bd); _bomb.SetLinearVelocity(-5.0f * bd.Position); CircleDef sd = new CircleDef(); sd.Radius = 0.3f; sd.Density = 20.0f; sd.Restitution = 0.1f; _bomb.CreateShape(sd); _bomb.SetMassFromShapes(); }
public CCDTest() { const float k_restitution = 1.4f; { BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, 20.0f); Body body = _world.CreateBody(bd); PolygonDef sd = new PolygonDef(); sd.Density = 0.0f; sd.Restitution = k_restitution; sd.SetAsBox(0.1f, 10.0f, new Vec2(-10.0f, 0.0f), 0.0f); body.CreateShape(sd); sd.SetAsBox(0.1f, 10.0f, new Vec2(10.0f, 0.0f), 0.0f); body.CreateShape(sd); sd.SetAsBox(0.1f, 10.0f, new Vec2(0.0f, -10.0f), 0.5f * Box2DX.Common.Settings.Pi); body.CreateShape(sd); sd.SetAsBox(0.1f, 10.0f, new Vec2(0.0f, 10.0f), -0.5f * Box2DX.Common.Settings.Pi); body.CreateShape(sd); } { PolygonDef sd_bottom = new PolygonDef(); sd_bottom.SetAsBox( 1.5f, 0.15f ); sd_bottom.Density = 4.0f; PolygonDef sd_left = new PolygonDef(); sd_left.SetAsBox(0.15f, 2.7f, new Vec2(-1.45f, 2.35f), 0.2f); sd_left.Density = 4.0f; PolygonDef sd_right = new PolygonDef(); sd_right.SetAsBox(0.15f, 2.7f, new Vec2(1.45f, 2.35f), -0.2f); sd_right.Density = 4.0f; BodyDef bd = new BodyDef(); bd.Position.Set( 0.0f, 15.0f ); Body body = _world.CreateBody(bd); body.CreateShape(sd_bottom); body.CreateShape(sd_left); body.CreateShape(sd_right); body.SetMassFromShapes(); } for (int i = 0; i < 0; ++i) { BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, 15.0f + i); bd.IsBullet = true; Body body = _world.CreateBody(bd); body.SetAngularVelocity(Box2DX.Common.Math.Random(-50.0f, 50.0f)); CircleDef sd = new CircleDef(); sd.Radius = 0.25f; sd.Density = 1.0f; sd.Restitution = 0.0f; body.CreateShape(sd); body.SetMassFromShapes(); } }
private Body CreatePole(Vec2 basePos, float angle, float radius, float friction, float restitution, float density, ushort layers) { // ==== Create bar. ==== // Determine position of top of pole relative to its center of mass. Vec2 polePosTopRelative = new Vec2(__ArmLength * (float)-SysMath.Sin(angle), __ArmLength * (float)SysMath.Cos(angle)); Vec2 polePosTop = polePosTopRelative + basePos; Vec2 polePosCenter = (polePosTopRelative * 0.5f) + basePos; BodyDef bodyDef = new BodyDef(); bodyDef.Position.Set(polePosCenter.X, polePosCenter.Y); bodyDef.Angle = angle; // Create body object; The body is also added to the world. Body body = _world.CreateBody(bodyDef); PolygonDef shapeDef = new PolygonDef(); shapeDef.SetAsBox(radius, __ArmLength * 0.5f); shapeDef.Friction = friction; shapeDef.Restitution = restitution; shapeDef.Density = density; shapeDef.Filter.MaskBits = layers; shapeDef.Filter.CategoryBits = 0x3; body.CreateShape(shapeDef); // ==== Place some end caps on the bar. ==== CircleDef circleDef = new CircleDef(); circleDef.Radius = radius; circleDef.Friction = friction; circleDef.Restitution = restitution; circleDef.Density = 0f; circleDef.Filter.MaskBits = layers; circleDef.Filter.CategoryBits = 0x3; // Top cap. circleDef.LocalPosition.Set(0f, __ArmLength * 0.5f); body.CreateShape(circleDef); // Bottom cap. circleDef.LocalPosition.Set(0f, -__ArmLength * 0.5f); body.CreateShape(circleDef); body.SetMassFromShapes(); return body; }
public CollisionFiltering() { // Ground body { PolygonDef sd = new PolygonDef(); sd.SetAsBox(50.0f, 10.0f); sd.Friction = 0.3f; BodyDef bd = new BodyDef(); bd.Position.Set(0.0f, -10.0f); Body ground = _world.CreateBody(bd); ground.CreateShape(sd); } // Small triangle PolygonDef triangleShapeDef = new PolygonDef(); triangleShapeDef.VertexCount = 3; triangleShapeDef.Vertices[0].Set(-1.0f, 0.0f); triangleShapeDef.Vertices[1].Set(1.0f, 0.0f); triangleShapeDef.Vertices[2].Set(0.0f, 2.0f); triangleShapeDef.Density = 1.0f; triangleShapeDef.Filter.GroupIndex = k_smallGroup; triangleShapeDef.Filter.CategoryBits = k_triangleCategory; triangleShapeDef.Filter.MaskBits = k_triangleMask; BodyDef triangleBodyDef = new BodyDef(); triangleBodyDef.Position.Set(-5.0f, 2.0f); Body body1 = _world.CreateBody(triangleBodyDef); body1.CreateShape(triangleShapeDef); body1.SetMassFromShapes(); // Large triangle (recycle definitions) triangleShapeDef.Vertices[0] *= 2.0f; triangleShapeDef.Vertices[1] *= 2.0f; triangleShapeDef.Vertices[2] *= 2.0f; triangleShapeDef.Filter.GroupIndex = k_largeGroup; triangleBodyDef.Position.Set(-5.0f, 6.0f); triangleBodyDef.FixedRotation = true; // look at me! Body body2 = _world.CreateBody(triangleBodyDef); body2.CreateShape(triangleShapeDef); body2.SetMassFromShapes(); // Small box PolygonDef boxShapeDef = new PolygonDef(); boxShapeDef.SetAsBox(1.0f, 0.5f); boxShapeDef.Density = 1.0f; boxShapeDef.Filter.GroupIndex = k_smallGroup; boxShapeDef.Filter.CategoryBits = k_boxCategory; boxShapeDef.Filter.MaskBits = k_boxMask; BodyDef boxBodyDef = new BodyDef(); boxBodyDef.Position.Set(0.0f, 2.0f); Body body3 = _world.CreateBody(boxBodyDef); body3.CreateShape(boxShapeDef); body3.SetMassFromShapes(); // Large box (recycle definitions) boxShapeDef.SetAsBox(2.0f, 1.0f); boxShapeDef.Filter.GroupIndex = k_largeGroup; boxBodyDef.Position.Set(0.0f, 6.0f); Body body4 = _world.CreateBody(boxBodyDef); body4.CreateShape(boxShapeDef); body4.SetMassFromShapes(); // Small circle CircleDef circleShapeDef = new CircleDef(); circleShapeDef.Radius = 1.0f; circleShapeDef.Density = 1.0f; circleShapeDef.Filter.GroupIndex = k_smallGroup; circleShapeDef.Filter.CategoryBits = k_circleCategory; circleShapeDef.Filter.MaskBits = k_circleMask; BodyDef circleBodyDef = new BodyDef(); circleBodyDef.Position.Set(5.0f, 2.0f); Body body5 = _world.CreateBody(circleBodyDef); body5.CreateShape(circleShapeDef); body5.SetMassFromShapes(); // Large circle circleShapeDef.Radius *= 2.0f; circleShapeDef.Filter.GroupIndex = k_largeGroup; circleBodyDef.Position.Set(5.0f, 6.0f); Body body6 = _world.CreateBody(circleBodyDef); body6.CreateShape(circleShapeDef); body6.SetMassFromShapes(); }