public SphereStack() { { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); for (int i = 0; i < e_count; ++i) { shape.Radius = Rand.RandomFloat(0.5f, 0.5f); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(0.0f, 4.0f + 3.0f * i); m_bodies[i] = m_world.CreateBody(bd); m_bodies[i].CreateFixture(shape, 1.0f); } } }
public 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); } } }
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 SphereStack() { { 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; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(0.0f, 4.0f + 3.0f * i); _bodies[i] = _world.CreateBody(bd); _bodies[i].CreateFixture(shape, 1.0f); //_bodies[i].SetLinearVelocity(new Vector2(0.0f, -100.0f)); } } }
public override void Keyboard(SFML.Window.KeyCode key) { switch (char.ToLower((char)key)) { case 'c': if (m_fixture2 == null) { CircleShape shape = new CircleShape(); shape.Radius = 3.0f; shape.Position = new Vec2(0.5f, -4.0f); m_fixture2 = m_body.CreateFixture(shape, 10.0f); m_body.IsAwake = true; } break; case 'd': if (m_fixture2 != null) { m_body.DestroyFixture(m_fixture2.Value); m_fixture2 = null; m_body.IsAwake = true; } break; } }
public void Clone() { CircleShape circle = new CircleShape(1.23f); CircleShape clone = circle.Clone() as CircleShape; Assert.IsNotNull(clone); Assert.AreEqual(circle.Radius, clone.Radius); Assert.AreEqual(circle.GetAabb(Pose.Identity).Minimum, clone.GetAabb(Pose.Identity).Minimum); Assert.AreEqual(circle.GetAabb(Pose.Identity).Maximum, clone.GetAabb(Pose.Identity).Maximum); }
public static void CollideCircles(out Manifold manifold, CircleShape circle1, Transform xf1, CircleShape circle2, Transform xf2) { var circle1Lock = circle1.Lock(); var circle2Lock = circle2.Lock(); NativeMethods.cb2_collidecircles(out manifold, circle1Lock, xf1, circle2Lock, xf2); circle1.Unlock(); circle2.Unlock(); }
public static void CollidePolygonAndCircle(out Manifold manifold, PolygonShape polygon, Transform xf1, CircleShape circle, Transform xf2) { var polyLock = polygon.Lock(); var circleLock = circle.Lock(); NativeMethods.cb2_collidepolygonandcircle(out manifold, polyLock, xf1, circleLock, xf2); polygon.Unlock(); circle.Unlock(); }
public void GetMesh() { var s = new CircleShape(3); var mesh = s.GetMesh(0.05f, 3); Assert.Greater(mesh.NumberOfTriangles, 1); foreach(var vertex in mesh.Vertices) { Assert.AreEqual(0, vertex.Z); } }
public Revolute() { System.Collections.Generic.List<JointDef> joints = new System.Collections.Generic.List<JointDef>(); Body ground = null; { BodyDef bd = new BodyDef(); ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); shape.Radius = 0.5f; BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; RevoluteJointDef rjd = new RevoluteJointDef(); bd.Position = new Vec2(0.0f, 20.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(shape, 5.0f); float w = 100.0f; body.AngularVelocity = w; body.LinearVelocity = new Vec2(-8.0f * w, 0.0f); rjd.Initialize(ground, body, new Vec2(0.0f, 12.0f)); rjd.MotorSpeed = 1.0f * (float)Math.PI; rjd.MaxMotorTorque = 10000.0f; rjd.EnableMotor = false; rjd.LowerAngle = -0.25f * (float)Math.PI; rjd.UpperAngle = 0.5f * (float)Math.PI; rjd.EnableLimit = true; rjd.CollideConnected = true; m_joint = (RevoluteJoint)m_world.CreateJoint(rjd); joints.Add(rjd); } using (System.IO.FileStream fs = new System.IO.FileStream("out.xml", System.IO.FileMode.Create)) { var serializer = Box2CS.Serialize.WorldSerializer.SerializeWorld(m_world, new Box2CS.Serialize.WorldXmlSerializer()); foreach (var j in joints) serializer.AddJoint(j); serializer.Serialize(fs); } }
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 ContinuousTest() { { BodyDef bd = new BodyDef(); bd.position = new Vector2(0.0f, 0.0f); Body body = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-10.0f, 0.0f), new Vector2(10.0f, 0.0f)); body.CreateFixture(shape, 1.0f); shape.SetAsBox(0.2f, 1.0f, new Vector2(0.5f, 1.0f), 0.0f); body.CreateFixture(shape, 1.0f); } #if true { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(0.0f, 20.0f); //bd.angle = 0.1f; PolygonShape shape = new PolygonShape(); shape.SetAsBox(2.0f, 0.1f); _body = _world.CreateBody(bd); _body.CreateFixture(shape, 1.0f); Launch(); } #else { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(0.0f, 0.5f); Body body = _world.CreateBody(bd); CircleShape shape = new CircleShape(); shape._p = new Vector2Zero(); shape._radius = 0.5f; body.CreateFixture(shape, 1.0f); //bd.bullet = true; bd.position = new Vector2(0.0f, 10.0f); body = _world.CreateBody(bd); body.CreateFixture(shape, 1.0f); body.SetLinearVelocity(new Vector2(0.0f, -100.0f)); } #endif }
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); }
public override void Keyboard(KeyboardState state, KeyboardState oldState) { if (state.IsKeyDown(Keys.C) && oldState.IsKeyUp(Keys.C) && _fixture2 == null) { CircleShape shape = new CircleShape(); shape._radius = 3.0f; shape._p = new Vector2(0.5f, -4.0f); _fixture2 = _body.CreateFixture(shape, 10.0f); _body.SetAwake(true); } if (state.IsKeyDown(Keys.D) && oldState.IsKeyUp(Keys.D) && _fixture2 != null) { _body.DestroyFixture(_fixture2); _fixture2 = null; _body.SetAwake(true); } }
public SensorTest() { { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { CircleShape shape = new CircleShape(); shape.Radius = 5.0f; shape.Position = new Vec2(0.0f, 10.0f); FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.IsSensor = true; m_sensor = ground.CreateFixture(fd); } } { CircleShape shape = new CircleShape(); for (int i = 0; i < e_count; ++i) { shape.Radius = Rand.RandomFloat(0.85f, 1.0f); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(-10.0f + 3.0f * i, 20.0f); bd.UserData = i; m_touching[i] = false; m_bodies[i] = m_world.CreateBody(bd); m_bodies[i].CreateFixture(shape, 1.0f); } } }
public OneSidedPlatform() { // Ground { BodyDef bd = new BodyDef(); Body ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-20.0f, 0.0f), new Vector2(20.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } // Platform { BodyDef bd = new BodyDef(); bd.position = new Vector2(0.0f, 10.0f); Body body = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsBox(3.0f, 0.5f); _platform = body.CreateFixture(shape, 0.0f); _bottom = 10.0f - 0.5f; _top = 10.0f + 0.5f; } // Actor { BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; bd.position = new Vector2(0.0f, 12.0f); Body body = _world.CreateBody(bd); _radius = 0.5f; CircleShape shape = new CircleShape(); shape._radius = _radius; _character = body.CreateFixture(shape, 20.0f); body.SetLinearVelocity(new Vector2(0.0f, -50.0f)); _state = State.e_unknown; } }
public Revolute() { 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); } { CircleShape shape = new CircleShape(); shape._radius = 0.5f; BodyDef bd = new BodyDef(); bd.type = BodyType.Dynamic; RevoluteJointDef rjd = new RevoluteJointDef(); bd.position = new Vector2(0.0f, 20.0f); Body body = _world.CreateBody(bd); body.CreateFixture(shape, 5.0f); float w = 100.0f; body.SetAngularVelocity(w); body.SetLinearVelocity(new Vector2(-8.0f * w, 0.0f)); rjd.Initialize(ground, body, new Vector2(0.0f, 12.0f)); rjd.motorSpeed = 1.0f * (float)Settings.b2_pi; rjd.maxMotorTorque = 10000.0f; rjd.enableMotor = false; rjd.lowerAngle = -0.25f * (float)Settings.b2_pi; rjd.upperAngle = 0.5f * (float)Settings.b2_pi; rjd.enableLimit = true; rjd.collideConnected = true; _joint = (RevoluteJoint)_world.CreateJoint(rjd); } }
void CreateCircle() { float radius = 2.0f; CircleShape shape = new CircleShape(); shape.Position = Vec2.Empty; shape.Radius = radius; FixtureDef fd = new FixtureDef(); fd.Shape = shape; fd.Density = 1.0f; fd.Friction = 0.0f; Vec2 p = new Vec2(Rand.RandomFloat(), 3.0f + Rand.RandomFloat()); BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = p; //bd.allowSleep = false; Body body = m_world.CreateBody(bd); body.CreateFixture(fd); }
public OneSidedPlatform() { // Ground { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-20.0f, 0.0f), new Vec2(20.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } // Platform { BodyDef bd = new BodyDef(); bd.Position = new Vec2(0.0f, 10.0f); Body body = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsBox(3.0f, 0.5f); m_platform = body.CreateFixture(shape, 0.0f); m_top = 10.0f + 0.5f; } // Actor { BodyDef bd = new BodyDef(); bd.BodyType = BodyType.Dynamic; bd.Position = new Vec2(0.0f, 12.0f); Body body = m_world.CreateBody(bd); m_radius = 0.5f; CircleShape shape = new CircleShape(); shape.Radius = m_radius; m_character = body.CreateFixture(shape, 20.0f); body.LinearVelocity = new Vec2(0.0f, -50.0f); } }
public void DrawNodeDisplay() { _nodeWindow.Draw(new Text("Node tree", _font, 35) { Position = new Vector2f(90, 30), FillColor = new Color(190, 190, 190) }); _nodeWindow.Draw(new Text(_data.Agent.Name, _font, 15) { Position = new Vector2f(260, 53), FillColor = new Color(200, 200, 200) }); bool finished = false; int level = 0; int parentXPos = 0; int childXPos = 0; Queue <Node <TileType> > levelNodeQueue = new Queue <Node <TileType> >(); Queue <Node <TileType> > nextLevelNodeQueue = new Queue <Node <TileType> >(); levelNodeQueue.Enqueue(_data.Agent.AgentData.RootNode); _nodeWindow.Draw(new CircleShape() { Position = new Vector2f( 105, 80), Radius = 5, FillColor = new Color(221, 108, 102) }); _nodeWindow.Draw(new Text("(" + _data.Agent.AgentData.RootNode.Pos.X + ", " + _data.Agent.AgentData.RootNode.Pos.Y + ")", _font, 10) { Position = new Vector2f( 105 + 15, 80), FillColor = new Color(220, 220, 220) }); while (!finished) { parentXPos = 0; childXPos = 0; while (levelNodeQueue.Count > 0) { Node <TileType> currentParentNode = levelNodeQueue.Dequeue(); foreach (Node <TileType> child in currentParentNode.Children) { nextLevelNodeQueue.Enqueue(child); // child is child node // current parent node is current parent node, xpos increases with eveyr child, however, we'll need to know the position of the parent node... // draw the line between aprent and child Vertex[] line = new Vertex[] { }; if (child.IsOnPath) { if (currentParentNode.IsOnPath) { line = new Vertex[] { new Vertex(new Vector2f(105 + 5 + 80 * parentXPos, 110 + 5 + 30 * (level - 1)), new Color(250, 250, 220)), new Vertex(new Vector2f(105 + 5 + 80 * childXPos, 110 + 5 + 30 * level), new Color(250, 250, 220)) }; } } else { line = new Vertex[] { new Vertex(new Vector2f(105 + 5 + 80 * parentXPos, 110 + 5 + 30 * (level - 1)), new Color(150, 150, 150)), new Vertex(new Vector2f(105 + 5 + 80 * childXPos, 110 + 5 + 30 * level), new Color(150, 150, 150)) }; } _nodeWindow.Draw(line, PrimitiveType.Lines); _nodeWindow.Draw(new Text("(" + child.Pos.X + ", " + child.Pos.Y + ")", _font, 10) { Position = new Vector2f( 105 + 15 + 80 * childXPos, 110 + 30 * level), FillColor = new Color(220, 220, 220) }); if (child.Cost != 0) { _nodeWindow.Draw(new Text("c: " + child.Cost, _font, 10) { Position = new Vector2f( 105 + 50 + 80 * childXPos, 110 + 30 * level), FillColor = new Color(220, 220, 220) }); } CircleShape nodeCircle = new CircleShape() { Position = new Vector2f( 105 + 80 * childXPos, 110 + 30 * level), Radius = 5, FillColor = HashedPosColor(child.Pos.X, child.Pos.Y, 100) }; if (_data.Agent.AgentData.PosToSearch.Count > 0) { if (child.Pos == _data.Agent.AgentData.PosToSearch[0]) { nodeCircle.FillColor = new Color(255, 201, 14); } } if (child.Data == TileType.Goal) { nodeCircle.FillColor = new Color(111, 221, 102); } _nodeWindow.Draw(nodeCircle); childXPos++; } parentXPos++; } // We've just looped through all the stuff in this level, all the children are in the next level // move each next level node to the level one and move on levelNodeQueue.Clear(); while (nextLevelNodeQueue.Count > 0) { levelNodeQueue.Enqueue(nextLevelNodeQueue.Dequeue()); } nextLevelNodeQueue.Clear(); if (levelNodeQueue.Count == 0) { finished = true; } level++; _nodeWindow.Draw(new Text("INTERNAL", _font, 10) { Position = new Vector2f( 5, 50), FillColor = new Color(220, 220, 220) }); int yPos = 0; for (int i = _data.Agent.AgentData.InternalHeap.Count - 1; i >= 0; i--) { Node <TileType> node = _data.Agent.AgentData.InternalHeap[i]; CircleShape nodeCircle = new CircleShape() { Position = new Vector2f( 10, 90 + 30 * yPos), Radius = 5, FillColor = HashedPosColor(node.Pos.X, node.Pos.Y, 100) }; _nodeWindow.Draw(nodeCircle); if (node.Cost != 0) { _nodeWindow.Draw(new Text(node.Cost.ToString(), _font, 10) { Position = new Vector2f( 12, 90 + 30 * yPos), FillColor = new Color(220, 220, 220) }); } _nodeWindow.Draw(new Text("(" + node.Pos.X + ", " + node.Pos.Y + ")", _font, 10) { Position = new Vector2f( 25, 90 + 30 * yPos), FillColor = new Color(220, 220, 220) }); yPos++; } } }
static bool collideEdgeAndCircle(EdgeShape edge, ref FSTransform edgeTransform, CircleShape circle, ref FSTransform circleTransform, out FSCollisionResult result) { result = new FSCollisionResult(); Collision.collideEdgeAndCircle(ref _manifold, edge, ref edgeTransform, circle, ref circleTransform); if (_manifold.pointCount > 0) { // code adapted from PositionSolverManifold.Initialize if (_manifold.type == ManifoldType.Circles) { // this is essentically directly from ContactSolver.WorldManifold.Initialize. To avoid doing the extra math twice we duplicate this code // here because it doesnt return some values we need to calculate separation var pointA = MathUtils.mul(ref edgeTransform, _manifold.localPoint); var pointB = MathUtils.mul(ref circleTransform, _manifold.points[0].localPoint); result.normal = pointA - pointB; Vector2Ext.normalize(ref result.normal); var cA = pointA - edge.radius * result.normal; var cB = pointB + circle.radius * result.normal; result.point = 0.5f * (cA + cB); result.point *= FSConvert.simToDisplay; var separation = Vector2.Dot(pointA - pointB, result.normal) - edge.radius - circle.radius; // Ensure normal points from A to B Vector2.Negate(ref result.normal, out result.normal); result.minimumTranslationVector = result.normal * Math.Abs(separation); } else // FaceA { result.normal = MathUtils.mul(edgeTransform.q, _manifold.localNormal); var planePoint = MathUtils.mul(ref edgeTransform, _manifold.localPoint); var clipPoint = MathUtils.mul(ref circleTransform, _manifold.points[0].localPoint); var separation = Vector2.Dot(clipPoint - planePoint, result.normal) - edge.radius - circle.radius; result.point = (clipPoint - result.normal * circle.radius) * FSConvert.simToDisplay; result.minimumTranslationVector = result.normal * -separation; } #if DEBUG_FSCOLLISIONS Debug.drawPixel(result.point, 5, Color.Red, 0.2f); Debug.drawLine(result.point, result.point + result.normal * 20, Color.Yellow, 0.2f); #endif return(true); } return(false); }
/// <summary> /// /// </summary> /// <param name="filename"></param> /// <param name="game"></param> public void Load(String filename, Game game) { fileName = filename; XmlTextReader reader = new XmlTextReader(filename); reader.ReadToFollowing("Data"); restitution = float.Parse(reader.GetAttribute("Restitution")); density = float.Parse(reader.GetAttribute("Density")); friction = float.Parse(reader.GetAttribute("Friction")); String fr = reader.GetAttribute("fixedRotation"); if (fr != null) { fixedRotation = bool.Parse(fr); } //Load images images = new List <Texture2D>(); reader.ReadToFollowing("Image"); int x; int y; do { x = int.Parse(reader.GetAttribute("width")); y = int.Parse(reader.GetAttribute("height")); String fileToLoad = reader.ReadElementContentAsString(); images.Add(game.Content.Load <Texture2D>(fileToLoad)); }while (reader.ReadToNextSibling("Image")); size = new Vector2(x, y); //Load animations animations = new Dictionary <string, List <short> >(); reader.ReadToFollowing("State"); do { String name = reader.GetAttribute("name"); String[] strs = reader.ReadElementContentAsString().Split(','); animations.Add(name, new List <short>()); List <short> tempList; animations.TryGetValue(name, out tempList); foreach (String s in strs) { tempList.Add(short.Parse(s)); } } while (reader.ReadToNextSibling("State")); reader.ReadToFollowing("Shape"); do { string shapeType = reader.GetAttribute("ShapeType"); string type = reader.GetAttribute("type"); switch (type) { case "Static": { bodyType = BodyType.Static; break; } case "Dynamic": { bodyType = BodyType.Dynamic; break; } case "Kinematic": { bodyType = BodyType.Kinematic; break; } } switch (shapeType) { case "Circle": { float rad = reader.ReadElementContentAsFloat(); shape = new CircleShape(); shape._radius = rad; break; } case "Polygon": { PolygonShape pShape = new PolygonShape(); List <Vector2> verts = new List <Vector2>(); float multiX = x / scale; float multiY = y / scale; reader.ReadToFollowing("Vertex"); do { String str = reader.ReadElementContentAsString(); String[] strs = str.Split(','); Vector2 vert = new Vector2(float.Parse(strs[0]) * multiX, float.Parse(strs[1]) * multiY); verts.Add(vert); } while (reader.ReadToNextSibling("Vertex")); pShape.Set(verts.ToArray(), verts.Count); shape = pShape; break; } } shapes.Add(shape); if (shapes.Count > 1) { Console.Write(" "); } }while(reader.ReadToNextSibling("Shape")); }
public CharacterCollision() { // Ground body { var bd = new BodyDef(); var ground = World.CreateBody(bd); var shape = new EdgeShape(); shape.SetTwoSided(new Vector2(-20.0f, 0.0f), new Vector2(20.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } // Collinear edges with no adjacency information. // This shows the problematic case where a box shape can hit // an internal vertex. { var bd = new BodyDef(); var ground = World.CreateBody(bd); var shape = new EdgeShape(); shape.SetTwoSided(new Vector2(-8.0f, 1.0f), new Vector2(-6.0f, 1.0f)); ground.CreateFixture(shape, 0.0f); shape.SetTwoSided(new Vector2(-6.0f, 1.0f), new Vector2(-4.0f, 1.0f)); ground.CreateFixture(shape, 0.0f); shape.SetTwoSided(new Vector2(-4.0f, 1.0f), new Vector2(-2.0f, 1.0f)); ground.CreateFixture(shape, 0.0f); } // Chain shape { var bd = new BodyDef { Angle = 0.25f * Settings.Pi }; var ground = World.CreateBody(bd); var vs = new Vector2[4] { new Vector2(5.0f, 7.0f), new Vector2(6.0f, 8.0f), new Vector2(7.0f, 8.0f), new Vector2(8.0f, 7.0f) }; var shape = new ChainShape(); shape.CreateChain(vs, 4, vs[0], vs[3]); ground.CreateFixture(shape, 0.0f); } // Square tiles. This shows that adjacency shapes may // have non-smooth collision. There is no solution // to this problem. { var bd = new BodyDef(); var ground = World.CreateBody(bd); var shape = new PolygonShape(); shape.SetAsBox(1.0f, 1.0f, new Vector2(4.0f, 3.0f), 0.0f); ground.CreateFixture(shape, 0.0f); shape.SetAsBox(1.0f, 1.0f, new Vector2(6.0f, 3.0f), 0.0f); ground.CreateFixture(shape, 0.0f); shape.SetAsBox(1.0f, 1.0f, new Vector2(8.0f, 3.0f), 0.0f); ground.CreateFixture(shape, 0.0f); } // Square made from an edge loop. Collision should be smooth. { var bd = new BodyDef(); var ground = World.CreateBody(bd); var vs = new Vector2[4] { new Vector2(-1.0f, 3.0f), new Vector2(1.0f, 3.0f), new Vector2(1.0f, 5.0f), new Vector2(-1.0f, 5.0f) }; var shape = new ChainShape(); shape.CreateLoop(vs); ground.CreateFixture(shape, 0.0f); } // Edge loop. Collision should be smooth. { var bd = new BodyDef { Position = new Vector2(-10.0f, 4.0f) }; var ground = World.CreateBody(bd); var vs = new Vector2[10] { new Vector2(0.0f, 0.0f), new Vector2(6.0f, 0.0f), new Vector2(6.0f, 2.0f), new Vector2(4.0f, 1.0f), new Vector2(2.0f, 2.0f), new Vector2(0.0f, 2.0f), new Vector2(-2.0f, 2.0f), new Vector2(-4.0f, 3.0f), new Vector2(-6.0f, 2.0f), new Vector2(-6.0f, 0.0f) }; var shape = new ChainShape(); shape.CreateLoop(vs); ground.CreateFixture(shape, 0.0f); } // Square character 1 { var bd = new BodyDef { Position = new Vector2(-3.0f, 8.0f), BodyType = BodyType.DynamicBody, FixedRotation = true, AllowSleep = false }; var body = World.CreateBody(bd); var shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.5f); var fd = new FixtureDef { Shape = shape, Density = 20.0f }; body.CreateFixture(fd); } // Square character 2 { var bd = new BodyDef { Position = new Vector2(-5.0f, 5.0f), BodyType = BodyType.DynamicBody, FixedRotation = true, AllowSleep = false }; var body = World.CreateBody(bd); var shape = new PolygonShape(); shape.SetAsBox(0.25f, 0.25f); var fd = new FixtureDef { Shape = shape, Density = 20.0f }; body.CreateFixture(fd); } // Hexagon character { var bd = new BodyDef { Position = new Vector2(-5.0f, 8.0f), BodyType = BodyType.DynamicBody, FixedRotation = true, AllowSleep = false }; var body = World.CreateBody(bd); var angle = 0.0f; const float delta = Settings.Pi / 3.0f; var vertices = new Vector2[6]; for (var i = 0; i < 6; ++i) { vertices[i].Set(0.5f * (float)Math.Cos(angle), 0.5f * (float)Math.Sin(angle)); angle += delta; } var shape = new PolygonShape(); shape.Set(vertices); var fd = new FixtureDef { Shape = shape, Density = 20.0f }; body.CreateFixture(fd); } // Circle character { var bd = new BodyDef { Position = new Vector2(3.0f, 5.0f), BodyType = BodyType.DynamicBody, FixedRotation = true, AllowSleep = false }; var body = World.CreateBody(bd); var shape = new CircleShape { Radius = 0.5f }; var fd = new FixtureDef { Shape = shape, Density = 20.0f }; body.CreateFixture(fd); } // Circle character { var bd = new BodyDef { Position = new Vector2(-7.0f, 6.0f), BodyType = BodyType.DynamicBody, AllowSleep = false }; _character = World.CreateBody(bd); var shape = new CircleShape { Radius = 0.25f }; var fd = new FixtureDef { Shape = shape, Density = 20.0f, Friction = 1.0f }; _character.CreateFixture(fd); } }
public void Create(BroadPhase broadPhase, Body body, XForm xf, FixtureDef def) { UserData = def.UserData; Friction = def.Friction; Restitution = def.Restitution; Density = def.Density; _body = body; _next = null; Filter = def.Filter; _isSensor = def.IsSensor; _type = def.Type; // Allocate and initialize the child shape. switch (_type) { case ShapeType.CircleShape: { CircleShape circle = new CircleShape(); CircleDef circleDef = (CircleDef)def; circle._position = circleDef.LocalPosition; circle._radius = circleDef.Radius; _shape = circle; } break; case ShapeType.PolygonShape: { PolygonShape polygon = new PolygonShape(); PolygonDef polygonDef = (PolygonDef)def; polygon.Set(polygonDef.Vertices, polygonDef.VertexCount); _shape = polygon; } break; case ShapeType.EdgeShape: { EdgeShape edge = new EdgeShape(); EdgeDef edgeDef = (EdgeDef)def; edge.Set(edgeDef.Vertex1, edgeDef.Vertex2); _shape = edge; } break; default: Box2DNetDebug.Assert(false); break; } // Create proxy in the broad-phase. AABB aabb; _shape.ComputeAABB(out aabb, xf); bool inRange = broadPhase.InRange(aabb); // You are creating a shape outside the world box. Box2DNetDebug.Assert(inRange); _proxyId = inRange ? broadPhase.CreateProxy(aabb, this) : PairManager.NullProxy; }
/// <summary> /// Activate the explosion at the specified position. /// </summary> /// <param name="pos">The position where the explosion happens </param> /// <param name="radius">The explosion radius </param> /// <param name="maxForce">The explosion force at the explosion point (then is inversely proportional to the square of the distance)</param> /// <returns>A list of bodies and the amount of force that was applied to them.</returns> public Dictionary <Fixture, Vector2> Activate(Vector2 pos, float radius, float maxForce) { AABB aabb; aabb.LowerBound = pos + new Vector2(-radius, -radius); aabb.UpperBound = pos + new Vector2(radius, radius); Fixture[] shapes = new Fixture[MaxShapes]; // More than 5 shapes in an explosion could be possible, but still strange. Fixture[] containedShapes = new Fixture[5]; bool exit = false; int shapeCount = 0; int containedShapeCount = 0; // Query the world for overlapping shapes. World.QueryAABB( fixture => { if (fixture.TestPoint(ref pos)) { if (IgnoreWhenInsideShape) { exit = true; return(false); } containedShapes[containedShapeCount++] = fixture; } else { shapes[shapeCount++] = fixture; } // Continue the query. return(true); }, ref aabb); if (exit) { return(new Dictionary <Fixture, Vector2>()); } Dictionary <Fixture, Vector2> exploded = new Dictionary <Fixture, Vector2>(shapeCount + containedShapeCount); // Per shape max/min angles for now. float[] vals = new float[shapeCount * 2]; int valIndex = 0; for (int i = 0; i < shapeCount; ++i) { PolygonShape ps; CircleShape cs = shapes[i].Shape as CircleShape; if (cs != null) { // We create a "diamond" approximation of the circle Vertices v = new Vertices(); Vector2 vec = Vector2.Zero + new Vector2(cs.Radius, 0); v.Add(vec); vec = Vector2.Zero + new Vector2(0, cs.Radius); v.Add(vec); vec = Vector2.Zero + new Vector2(-cs.Radius, cs.Radius); v.Add(vec); vec = Vector2.Zero + new Vector2(0, -cs.Radius); v.Add(vec); ps = new PolygonShape(v, 0); } else { ps = shapes[i].Shape as PolygonShape; } if ((shapes[i].Body.BodyType == BodyType.Dynamic) && ps != null) { Vector2 toCentroid = shapes[i].Body.GetWorldPoint(ps.MassData.Centroid) - pos; float angleToCentroid = (float)Math.Atan2(toCentroid.Y, toCentroid.X); float min = float.MaxValue; float max = float.MinValue; float minAbsolute = 0.0f; float maxAbsolute = 0.0f; for (int j = 0; j < ps.Vertices.Count; ++j) { Vector2 toVertex = (shapes[i].Body.GetWorldPoint(ps.Vertices[j]) - pos); float newAngle = (float)Math.Atan2(toVertex.Y, toVertex.X); float diff = (newAngle - angleToCentroid); diff = (diff - MathHelper.Pi) % (2 * MathHelper.Pi); // the minus pi is important. It means cutoff for going other direction is at 180 deg where it needs to be if (diff < 0.0f) { diff += 2 * MathHelper.Pi; // correction for not handling negs } diff -= MathHelper.Pi; if (Math.Abs(diff) > MathHelper.Pi) { continue; // Something's wrong, point not in shape but exists angle diff > 180 } if (diff > max) { max = diff; maxAbsolute = newAngle; } if (diff < min) { min = diff; minAbsolute = newAngle; } } vals[valIndex] = minAbsolute; ++valIndex; vals[valIndex] = maxAbsolute; ++valIndex; } } Array.Sort(vals, 0, valIndex, _rdc); _data.Clear(); bool rayMissed = true; for (int i = 0; i < valIndex; ++i) { Fixture fixture = null; float midpt; int iplus = (i == valIndex - 1 ? 0 : i + 1); if (vals[i] == vals[iplus]) { continue; } if (i == valIndex - 1) { // the single edgecase midpt = (vals[0] + MathHelper.Pi * 2 + vals[i]); } else { midpt = (vals[i + 1] + vals[i]); } midpt = midpt / 2; Vector2 p1 = pos; Vector2 p2 = radius * new Vector2((float)Math.Cos(midpt), (float)Math.Sin(midpt)) + pos; // RaycastOne bool hitClosest = false; World.RayCast((f, p, n, fr) => { Body body = f.Body; if (!IsActiveOn(body)) { return(0); } hitClosest = true; fixture = f; return(fr); }, p1, p2); // draws radius points if ((hitClosest) && (fixture.Body.BodyType == BodyType.Dynamic)) { if ((_data.Any()) && (_data.Last().Body == fixture.Body) && (!rayMissed)) { int laPos = _data.Count - 1; ShapeData la = _data[laPos]; la.Max = vals[iplus]; _data[laPos] = la; } else { // make new ShapeData d; d.Body = fixture.Body; d.Min = vals[i]; d.Max = vals[iplus]; _data.Add(d); } if ((_data.Count > 1) && (i == valIndex - 1) && (_data.Last().Body == _data.First().Body) && (_data.Last().Max == _data.First().Min)) { ShapeData fi = _data[0]; fi.Min = _data.Last().Min; _data.RemoveAt(_data.Count - 1); _data[0] = fi; while (_data.First().Min >= _data.First().Max) { fi.Min -= MathHelper.Pi * 2; _data[0] = fi; } } int lastPos = _data.Count - 1; ShapeData last = _data[lastPos]; while ((_data.Count > 0) && (_data.Last().Min >= _data.Last().Max)) // just making sure min<max { last.Min = _data.Last().Min - 2 * MathHelper.Pi; _data[lastPos] = last; } rayMissed = false; } else { rayMissed = true; // raycast did not find a shape } } for (int i = 0; i < _data.Count; ++i) { if (!IsActiveOn(_data[i].Body)) { continue; } float arclen = _data[i].Max - _data[i].Min; float first = MathHelper.Min(maxEdgeOffset, EdgeRatio * arclen); int insertedRays = (int)Math.Ceiling(((arclen - 2.0f * first) - (MinRays - 1) * MaxAngle) / MaxAngle); if (insertedRays < 0) { insertedRays = 0; } float offset = (arclen - first * 2.0f) / ((float)MinRays + insertedRays - 1); //Note: This loop can go into infinite as it operates on floats. //Added FloatEquals with a large epsilon. for (float j = _data[i].Min + first; j < _data[i].Max || MathUtils.FloatEquals(j, _data[i].Max, 0.0001f); j += offset) { Vector2 p1 = pos; Vector2 p2 = pos + radius * new Vector2((float)Math.Cos(j), (float)Math.Sin(j)); Vector2 hitpoint = Vector2.Zero; float minlambda = float.MaxValue; List <Fixture> fl = _data[i].Body.FixtureList; for (int x = 0; x < fl.Count; x++) { Fixture f = fl[x]; RayCastInput ri; ri.Point1 = p1; ri.Point2 = p2; ri.MaxFraction = 50f; RayCastOutput ro; if (f.RayCast(out ro, ref ri, 0)) { if (minlambda > ro.Fraction) { minlambda = ro.Fraction; hitpoint = ro.Fraction * p2 + (1 - ro.Fraction) * p1; } } // the force that is to be applied for this particular ray. // offset is angular coverage. lambda*length of segment is distance. float impulse = (arclen / (MinRays + insertedRays)) * maxForce * 180.0f / MathHelper.Pi * (1.0f - Math.Min(1.0f, minlambda)); // We Apply the impulse!!! Vector2 vectImp = Vector2.Dot(impulse * new Vector2((float)Math.Cos(j), (float)Math.Sin(j)), -ro.Normal) * new Vector2((float)Math.Cos(j), (float)Math.Sin(j)); _data[i].Body.ApplyLinearImpulse(ref vectImp, ref hitpoint); // We gather the fixtures for returning them if (exploded.ContainsKey(f)) { exploded[f] += vectImp; } else { exploded.Add(f, vectImp); } if (minlambda > 1.0f) { hitpoint = p2; } } } } // We check contained shapes for (int i = 0; i < containedShapeCount; ++i) { Fixture fix = containedShapes[i]; if (!IsActiveOn(fix.Body)) { continue; } float impulse = MinRays * maxForce * 180.0f / MathHelper.Pi; Vector2 hitPoint; CircleShape circShape = fix.Shape as CircleShape; if (circShape != null) { hitPoint = fix.Body.GetWorldPoint(circShape.Position); } else { PolygonShape shape = fix.Shape as PolygonShape; hitPoint = fix.Body.GetWorldPoint(shape.MassData.Centroid); } Vector2 vectImp = impulse * (hitPoint - pos); fix.Body.ApplyLinearImpulse(ref vectImp, ref hitPoint); if (!exploded.ContainsKey(fix)) { exploded.Add(fix, vectImp); } } return(exploded); }
public RayCast() { // Ground body { BodyDef bd = new BodyDef(); Body ground = m_world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vec2(-40.0f, 0.0f), new Vec2(40.0f, 0.0f)); ground.CreateFixture(shape, 0.0f); } { Vec2[] vertices = new Vec2[3]; vertices[0] = new Vec2(-0.5f, 0.0f); vertices[1] = new Vec2(0.5f, 0.0f); vertices[2] = new Vec2(0.0f, 1.5f); m_polygons[0] = new PolygonShape(); m_polygons[0].Vertices = vertices; } { Vec2[] vertices = new Vec2[3]; vertices[0] = new Vec2(-0.1f, 0.0f); vertices[1] = new Vec2(0.1f, 0.0f); vertices[2] = new Vec2(0.0f, 1.5f); m_polygons[1] = new PolygonShape(); m_polygons[1].Vertices = vertices; } { float w = 1.0f; float b = w / (2.0f + (float)Math.Sqrt(2.0f)); float s = (float)Math.Sqrt(2.0f) * b; Vec2[] vertices = new Vec2[8]; vertices[0] = new Vec2(0.5f * s, 0.0f); vertices[1] = new Vec2(0.5f * w, b); vertices[2] = new Vec2(0.5f * w, b + s); vertices[3] = new Vec2(0.5f * s, w); vertices[4] = new Vec2(-0.5f * s, w); vertices[5] = new Vec2(-0.5f * w, b + s); vertices[6] = new Vec2(-0.5f * w, b); vertices[7] = new Vec2(-0.5f * s, 0.0f); m_polygons[2] = new PolygonShape(); m_polygons[2].Vertices = vertices; } { m_polygons[3] = new PolygonShape(); m_polygons[3].SetAsBox(0.5f, 0.5f); } { m_circle = new CircleShape(); m_circle.Radius = 0.5f; } m_bodyIndex = 0; m_angle = 0.0f; m_mode = Mode.e_closest; }
public DialogueBox(GameState state, string tag) { this.state = state; this.tag = tag; if (tag == "AI") { cursor = new CircleShape((SCREEN_WIDTH / 1920) * 10, 3); dialogueFontSize = getFontSize(); nameFontSize = getFontSize() + 20; cursor.Rotation = 180; } else if (tag == "PLAYER") { cursor = new CircleShape((SCREEN_WIDTH / 1920) * 20, 3); dialogueFontSize = getFontSize() + 20; nameFontSize = getFontSize() + 30; cursor.Rotation = 180; } else if (tag == "tooltip") { dialogueFontSize = getFontSize() - 3; nameFontSize = getFontSize() - 10; } if (tag != "tooltip") { if (!spriteDict.ContainsKey("left")) { spriteDict.Add("left", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/speechbubbleleft.png"))); spriteDict["left"].Scale = scale; } if (!spriteDict.ContainsKey("right")) { spriteDict.Add("right", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/speechbubbleright.png"))); spriteDict["right"].Scale = scale; } if (!spriteDict.ContainsKey("player")) { spriteDict.Add("player", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/psb.png"))); spriteDict["player"].Scale = scale; } } else { // Tooltip 1 if (!spriteDict.ContainsKey("tooltipleft")) { spriteDict.Add("tooltipleft", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/tooltipinforight.png"))); spriteDict["tooltipleft"].Scale = scale; } if (!spriteDict.ContainsKey("tooltiplefthover")) { spriteDict.Add("tooltiplefthover", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/tooltipinforighthover.png"))); spriteDict["tooltiplefthover"].Scale = scale; } // Tooltip 2 if (!spriteDict.ContainsKey("tooltipright")) { spriteDict.Add("tooltipright", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/tooltipinfotest.png"))); spriteDict["tooltipright"].Scale = scale; } if (!spriteDict.ContainsKey("tooltiprighthover")) { spriteDict.Add("tooltiprighthover", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/tooltipinfotesthover.png"))); spriteDict["tooltiprighthover"].Scale = scale; } // Tooltip 3 if (!spriteDict.ContainsKey("tooltipsmall")) { spriteDict.Add("tooltipsmall", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/speakbuttontooltip.png"))); spriteDict["tooltipsmall"].Scale = scale; } if (!spriteDict.ContainsKey("tooltipsmallhover")) { spriteDict.Add("tooltipsmallhover", new Sprite(new Texture("../../Art/UI_Art/buttons n boxes/speakbuttontooltiphover.png"))); spriteDict["tooltipsmallhover"].Scale = scale; } } }
private EdgeShapesTest() { // Ground body { Body ground = BodyFactory.CreateBody(World); float x1 = -20.0f; float y1 = 2.0f * (float)Math.Cos(x1 / 10.0f * (float)Math.PI); for (int i = 0; i < 80; ++i) { float x2 = x1 + 0.5f; float y2 = 2.0f * (float)Math.Cos(x2 / 10.0f * (float)Math.PI); EdgeShape shape = new EdgeShape(new Vector2(x1, y1), new Vector2(x2, y2)); ground.CreateFixture(shape); x1 = x2; y1 = y2; } } { Vertices vertices = new Vertices(3); vertices.Add(new Vector2(-0.5f, 0.0f)); vertices.Add(new Vector2(0.5f, 0.0f)); vertices.Add(new Vector2(0.0f, 1.5f)); _polygons[0] = new PolygonShape(vertices, 20); } { Vertices vertices = new Vertices(3); vertices.Add(new Vector2(-0.1f, 0.0f)); vertices.Add(new Vector2(0.1f, 0.0f)); vertices.Add(new Vector2(0.0f, 1.5f)); _polygons[1] = new PolygonShape(vertices, 20); } { const float w = 1.0f; float b = w / (2.0f + (float)Math.Sqrt(2.0f)); float s = (float)Math.Sqrt(2.0f) * b; Vertices vertices = new Vertices(8); vertices.Add(new Vector2(0.5f * s, 0.0f)); vertices.Add(new Vector2(0.5f * w, b)); vertices.Add(new Vector2(0.5f * w, b + s)); vertices.Add(new Vector2(0.5f * s, w)); vertices.Add(new Vector2(-0.5f * s, w)); vertices.Add(new Vector2(-0.5f * w, b + s)); vertices.Add(new Vector2(-0.5f * w, b)); vertices.Add(new Vector2(-0.5f * s, 0.0f)); _polygons[2] = new PolygonShape(vertices, 20); } { _polygons[3] = new PolygonShape(20); _polygons[3].Vertices = PolygonUtils.CreateRectangle(0.5f, 0.5f); } { _circle = new CircleShape(0.5f, 1); } _bodyIndex = 0; _angle = 0.0f; }
//NoNeed Body _middle; public Bridge() { Body ground = null; { BodyDef bd = new BodyDef(); ground = _world.CreateBody(bd); PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-40.0, 0.0), new Vector2(40.0, 0.0)); ground.CreateFixture(shape, 0.0); } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(0.5f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.density = 20.0f; fd.friction = 0.2f; RevoluteJointDef jd = new RevoluteJointDef(); 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); if (i == (e_count >> 1)) { //NoNeed _middle = body; } prevBody = body; } Vector2 anchor2 = new Vector2(-15.0f + 1.0f * e_count, 5.0f); jd.Initialize(prevBody, ground, anchor2); _world.CreateJoint(jd); } Vector2[] vertices = new Vector2[3]; for (int i = 0; i < 2; ++i) { 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 < 3; ++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 CollisionProcessing() { // Ground body { PolygonShape shape = new PolygonShape(); shape.SetAsEdge(new Vector2(-50.0, 0.0), new Vector2(50.0, 0.0)); FixtureDef sd = new FixtureDef(); sd.shape = shape; BodyDef bd = new BodyDef(); Body ground = _world.CreateBody(bd); ground.CreateFixture(sd); } double xLo = -5.0, xHi = 5.0; double yLo = 2.0, yHi = 35.0; // 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); }
public CircleContact(Fixture fA, int indexA, Fixture fB, int indexB) : base(fA, indexA, fB, indexB) { circleB = (CircleShape)m_fixtureB.Shape; circleA = (CircleShape)m_fixtureA.Shape; }
private TheoJansenTest() { _offset = new Vector2(0.0f, 8.0f); _motorSpeed = 2.0f; _motorOn = true; Vector2 pivot = new Vector2(0.0f, 0.8f); // Ground { Body ground = BodyFactory.CreateEdge(World, new Vector2(-50.0f, 0.0f), new Vector2(50.0f, 0.0f)); FixtureFactory.AttachEdge(new Vector2(-50.0f, 0.0f), new Vector2(-50.0f, 10.0f), ground); FixtureFactory.AttachEdge(new Vector2(50.0f, 0.0f), new Vector2(50.0f, 10.0f), ground); } // Balls for (int i = 0; i < 40; ++i) { CircleShape shape = new CircleShape(0.25f, 1); Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-40.0f + 2.0f * i, 0.5f); body.CreateFixture(shape); } // Chassis { PolygonShape shape = new PolygonShape(1); shape.Vertices = PolygonUtils.CreateRectangle(2.5f, 1.0f); _chassis = BodyFactory.CreateBody(World); _chassis.BodyType = BodyType.Dynamic; _chassis.Position = pivot + _offset; Fixture fixture = _chassis.CreateFixture(shape); fixture.CollisionGroup = -1; } { CircleShape shape = new CircleShape(1.6f, 1); _wheel = BodyFactory.CreateBody(World); _wheel.BodyType = BodyType.Dynamic; _wheel.Position = pivot + _offset; Fixture fixture = _wheel.CreateFixture(shape); fixture.CollisionGroup = -1; } { _motorJoint = new RevoluteJoint(_wheel, _chassis, _chassis.Position, true); _motorJoint.CollideConnected = false; _motorJoint.MotorSpeed = _motorSpeed; _motorJoint.MaxMotorTorque = 400.0f; _motorJoint.MotorEnabled = _motorOn; World.AddJoint(_motorJoint); } Vector2 wheelAnchor = pivot + new Vector2(0.0f, -0.8f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); _wheel.SetTransform(_wheel.Position, 120.0f * Settings.Pi / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); _wheel.SetTransform(_wheel.Position, -120.0f * Settings.Pi / 180.0f); CreateLeg(-1.0f, wheelAnchor); CreateLeg(1.0f, wheelAnchor); }
public void DrawShape(Fixture fixture, Transform xf, Color color) { switch (fixture.ShapeType) { case ShapeType.Circle: { CircleShape circle = (CircleShape)fixture.Shape; Vector2 center = MathUtils.Multiply(ref xf, circle.Position); float radius = circle.Radius; Vector2 axis = xf.R.Col1; if (DrawSolidShapes) { DrawSolidCircle(center, radius, axis, color); } else { DrawCircle(center, radius, color); } } break; case ShapeType.Polygon: { PolygonShape poly = (PolygonShape)fixture.Shape; int vertexCount = poly.Vertices.Count; Debug.Assert(vertexCount <= Settings.MaxPolygonVertices); for (int i = 0; i < vertexCount; ++i) { _tempVertices[i] = MathUtils.Multiply(ref xf, poly.Vertices[i]); } if (DrawSolidShapes) { DrawSolidPolygon(_tempVertices, vertexCount, color); } else { DrawPolygon(_tempVertices, vertexCount, color); } } break; case ShapeType.Edge: { EdgeShape edge = (EdgeShape)fixture.Shape; Vector2 v1 = MathUtils.Multiply(ref xf, edge.Vertex1); Vector2 v2 = MathUtils.Multiply(ref xf, edge.Vertex2); DrawSegment(v1, v2, color); } break; case ShapeType.Loop: { LoopShape loop = (LoopShape)fixture.Shape; int count = loop.Vertices.Count; Vector2 v1 = MathUtils.Multiply(ref xf, loop.Vertices[count - 1]); DrawCircle(v1, 0.05f, color); for (int i = 0; i < count; ++i) { Vector2 v2 = MathUtils.Multiply(ref xf, loop.Vertices[i]); DrawSegment(v1, v2, color); v1 = v2; } } break; } }
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 void JointReactions() { var gravity = new Vector2(0, -10.0f); World world = new World(gravity); BodyDef bodyDef = new BodyDef(); Body ground = world.CreateBody(bodyDef); CircleShape circle = new CircleShape(); circle.Radius = 1.0f; FixtureDef fixtureDef = new FixtureDef(); // Disable collision fixtureDef.Filter.MaskBits = 0; fixtureDef.Density = 1.0f; fixtureDef.Shape = circle; bodyDef.BodyType = BodyType.DynamicBody; bodyDef.Position.Set(-2.0f, 3.0f); var bodyA = world.CreateBody(bodyDef); var bodyB = world.CreateBody(bodyDef); var bodyC = world.CreateBody(bodyDef); circle.ComputeMass(out var massData, fixtureDef.Density); var mg = massData.Mass * gravity.Y; bodyA.CreateFixture(fixtureDef); bodyB.CreateFixture(fixtureDef); bodyC.CreateFixture(fixtureDef); DistanceJointDef distanceJointDef = new DistanceJointDef(); distanceJointDef.Initialize(ground, bodyA, bodyDef.Position + new Vector2(0.0f, 4.0f), bodyDef.Position); distanceJointDef.MinLength = distanceJointDef.Length; distanceJointDef.MaxLength = distanceJointDef.Length; PrismaticJointDef prismaticJointDef = new PrismaticJointDef(); prismaticJointDef.Initialize(ground, bodyB, bodyDef.Position, new Vector2(1.0f, 0.0f)); RevoluteJointDef revoluteJointDef = new RevoluteJointDef(); revoluteJointDef.Initialize(ground, bodyC, bodyDef.Position); var distanceJoint = (DistanceJoint)world.CreateJoint(distanceJointDef); var prismaticJoint = (PrismaticJoint)world.CreateJoint(prismaticJointDef); var revoluteJoint = (RevoluteJoint)world.CreateJoint(revoluteJointDef); const float timeStep = 1 / 60f; const float invTimeStep = 60.0f; const int velocityIterations = 6; const int positionIterations = 2; world.Step(timeStep, velocityIterations, positionIterations); const float tol = 1e-5f; { var F = distanceJoint.GetReactionForce(invTimeStep); var T = distanceJoint.GetReactionTorque(invTimeStep); F.X.ShouldBe(0.0f); Math.Abs(F.Y + mg).ShouldBeLessThan(tol); T.ShouldBe(0.0f); } { var F = prismaticJoint.GetReactionForce(invTimeStep); var T = prismaticJoint.GetReactionTorque(invTimeStep); F.X.ShouldBe(0.0f); Math.Abs(F.Y + mg).ShouldBeLessThan(tol); T.ShouldBe(0.0f); } { var F = revoluteJoint.GetReactionForce(invTimeStep); var T = revoluteJoint.GetReactionTorque(invTimeStep); F.X.ShouldBe(0.0f); Math.Abs(F.Y + mg).ShouldBeLessThan(tol); T.ShouldBe(0.0f); } }
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); } }
/// <summary> /// Compute contact points for edge versus circle. /// This accounts for edge connectivity. /// </summary> /// <param name="manifold">The manifold.</param> /// <param name="edgeA">The edge A.</param> /// <param name="transformA">The transform A.</param> /// <param name="circleB">The circle B.</param> /// <param name="transformB">The transform B.</param> public static void CollideEdgeAndCircle(ref Manifold manifold, EdgeShape edgeA, ref Transform transformA, CircleShape circleB, ref Transform transformB) { manifold.PointCount = 0; // Compute circle in frame of edge Vector2 Q = MathUtils.MulT(ref transformA, MathUtils.Mul(ref transformB, ref circleB._position)); Vector2 A = edgeA.Vertex1, B = edgeA.Vertex2; Vector2 e = B - A; // Barycentric coordinates float u = Vector2.Dot(e, B - Q); float v = Vector2.Dot(e, Q - A); float radius = edgeA.Radius + circleB.Radius; ContactFeature cf; cf.IndexB = 0; cf.TypeB = ContactFeatureType.Vertex; // Region A if (v <= 0.0f) { Vector2 P1 = A; Vector2 d1 = Q - P1; float dd1 = Vector2.Dot(d1, d1); if (dd1 > radius * radius) { return; } // Is there an edge connected to A? if (edgeA.HasVertex0) { Vector2 A1 = edgeA.Vertex0; Vector2 B1 = A; Vector2 e1 = B1 - A1; float u1 = Vector2.Dot(e1, B1 - Q); // Is the circle in Region AB of the previous edge? if (u1 > 0.0f) { return; } } cf.IndexA = 0; cf.TypeA = ContactFeatureType.Vertex; manifold.PointCount = 1; manifold.Type = ManifoldType.Circles; manifold.LocalNormal = Vector2.Zero; manifold.LocalPoint = P1; manifold.Points.Value0.Id.Key = 0; manifold.Points.Value0.Id.ContactFeature = cf; manifold.Points.Value0.LocalPoint = circleB.Position; return; } // Region B if (u <= 0.0f) { Vector2 P2 = B; Vector2 d2 = Q - P2; float dd2 = Vector2.Dot(d2, d2); if (dd2 > radius * radius) { return; } // Is there an edge connected to B? if (edgeA.HasVertex3) { Vector2 B2 = edgeA.Vertex3; Vector2 A2 = B; Vector2 e2 = B2 - A2; float v2 = Vector2.Dot(e2, Q - A2); // Is the circle in Region AB of the next edge? if (v2 > 0.0f) { return; } } cf.IndexA = 1; cf.TypeA = (byte)ContactFeatureType.Vertex; manifold.PointCount = 1; manifold.Type = ManifoldType.Circles; manifold.LocalNormal = Vector2.Zero; manifold.LocalPoint = P2; manifold.Points.Value0.Id.Key = 0; manifold.Points.Value0.Id.ContactFeature = cf; manifold.Points.Value0.LocalPoint = circleB.Position; return; } // Region AB float den = Vector2.Dot(e, e); System.Diagnostics.Debug.Assert(den > 0.0f); Vector2 P = (1.0f / den) * (u * A + v * B); Vector2 d = Q - P; float dd = Vector2.Dot(d, d); if (dd > radius * radius) { return; } Vector2 n = new Vector2(-e.Y, e.X); if (Vector2.Dot(n, Q - A) < 0.0f) { n = new Vector2(-n.X, -n.Y); } n.Normalize(); cf.IndexA = 0; cf.TypeA = ContactFeatureType.Face; manifold.PointCount = 1; manifold.Type = ManifoldType.FaceA; manifold.LocalNormal = n; manifold.LocalPoint = A; manifold.Points.Value0.Id.Key = 0; manifold.Points.Value0.Id.ContactFeature = cf; manifold.Points.Value0.LocalPoint = circleB.Position; }
public override bool Initialize() { if (!base.Initialize()) { return(false); } if (!RetrieveSibling(out m_state)) { return(false); } var size = m_state.Dimensions; m_bodyShape = new RectangleShape { FillColor = Color.White, OutlineColor = Color.Black, OutlineThickness = OutlineThickness, Size = size.ToVector2f(), Origin = new Vector2f(size.X / 2, size.Y / 2) }; // fill is positioned at the base of the body so it acts as a health bar m_bodyFillShape = new RectangleShape { Size = size.ToVector2f(), Origin = new Vector2f(0, size.Y / 2) }; m_bodyFillTransform.Translate(-size.X / 2, 0); // tracks are 90% of the body length size.X *= 0.9f; size.Y += (m_state.TrackWidth * 2); m_trackShape = new RectangleShape { FillColor = Color.Black, Size = size.ToVector2f(), Origin = new Vector2f(size.X / 2, size.Y / 2) }; var turretRadius = m_state.TurretWidth / 2; m_turretShape = new CircleShape { FillColor = BodyColor, OutlineColor = Color.Black, OutlineThickness = OutlineThickness, Radius = turretRadius, Origin = new Vector2f(turretRadius, turretRadius) }; // make the barrel extend from the center of the turret for simplicity size = m_state.BarrelDimensions + new Vector2(turretRadius, 0); m_barrelShape = new RectangleShape { FillColor = BodyColor, OutlineColor = Color.Black, OutlineThickness = OutlineThickness, Size = size.ToVector2f(), Origin = new Vector2f(0, size.Y / 2) }; Initialized = true; return(true); }
static bool collidePolygonCircle(PolygonShape polygon, ref FSTransform polyTransform, CircleShape circle, ref FSTransform circleTransform, out FSCollisionResult result) { result = new FSCollisionResult(); Collision.collidePolygonAndCircle(ref _manifold, polygon, ref polyTransform, circle, ref circleTransform); if (_manifold.pointCount > 0) { FixedArray2 <Vector2> points; ContactSolver.WorldManifold.initialize(ref _manifold, ref polyTransform, polygon.radius, ref circleTransform, circle.radius, out result.normal, out points); //var circleInPolySpace = polygonFixture.Body.GetLocalPoint( circleFixture.Body.Position ); var circleInPolySpace = MathUtils.mulT(ref polyTransform, circleTransform.p); var value1 = circleInPolySpace - _manifold.localPoint; var value2 = _manifold.localNormal; var separation = circle.radius - (value1.X * value2.X + value1.Y * value2.Y); if (separation <= 0) { return(false); } result.point = points[0] * FSConvert.simToDisplay; result.minimumTranslationVector = result.normal * separation; #if DEBUG_FSCOLLISIONS Debug.drawPixel(result.point, 2, Color.Red, 0.2f); Debug.drawLine(result.point, result.point + result.normal * 20, Color.Yellow, 0.2f); #endif return(true); } return(false); }
protected override BodyContainer Read(ContentReader input, BodyContainer existingInstance) { BodyContainer bodies = existingInstance ?? new BodyContainer(); int count = input.ReadInt32(); for (int i = 0; i < count; i++) { string name = input.ReadString(); BodyTemplate body = new BodyTemplate { Mass = input.ReadSingle(), BodyType = (BodyType)input.ReadInt32() }; int fixtureCount = input.ReadInt32(); for (int j = 0; j < fixtureCount; j++) { FixtureTemplate fixture = new FixtureTemplate { Name = input.ReadString(), Restitution = input.ReadSingle(), Friction = input.ReadSingle() }; ShapeType type = (ShapeType)input.ReadInt32(); switch (type) { case ShapeType.Circle: { float density = input.ReadSingle(); float radius = input.ReadSingle(); CircleShape circle = new CircleShape(radius, density); circle.Position = input.ReadVector2(); fixture.Shape = circle; } break; case ShapeType.Polygon: { Vertices verts = new Vertices(Settings.MaxPolygonVertices); float density = input.ReadSingle(); int verticeCount = input.ReadInt32(); for (int k = 0; k < verticeCount; k++) { verts.Add(input.ReadVector2()); } PolygonShape poly = new PolygonShape(verts, density); poly.MassData.Centroid = input.ReadVector2(); fixture.Shape = poly; } break; case ShapeType.Edge: { EdgeShape edge = new EdgeShape(input.ReadVector2(), input.ReadVector2()); edge.HasVertex0 = input.ReadBoolean(); if (edge.HasVertex0) { edge.Vertex0 = input.ReadVector2(); } edge.HasVertex3 = input.ReadBoolean(); if (edge.HasVertex3) { edge.Vertex3 = input.ReadVector2(); } fixture.Shape = edge; } break; case ShapeType.Chain: { Vertices verts = new Vertices(); int verticeCount = input.ReadInt32(); for (int k = 0; k < verticeCount; k++) { verts.Add(input.ReadVector2()); } fixture.Shape = new ChainShape(verts); } break; } body.Fixtures.Add(fixture); } bodies[name] = body; } return(bodies); }
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); }
static void Main(string[] args) { GroupCollection collection1 = new GroupCollection(); GroupCollection collection2 = new GroupCollection(); /* collection1.AddRange(new int[] { 1 }); * collection1.AddRange(new int[] { 3 }); * collection1.AddRange(new int[] { 2 });*/ collection1.Add(1); collection1.Add(3); collection1.Add(2); collection2.Add(1); Console.WriteLine(GroupCollection.Intersect(collection1, collection2)); Console.ReadLine(); return; PhysicsEngine engine = new PhysicsEngine(); engine.BroadPhase = new Physics2DDotNet.Detectors.SelectiveSweepDetector(); engine.Solver = new Physics2DDotNet.Solvers.SequentialImpulsesSolver(); PhysicsTimer timer = new PhysicsTimer(engine.Update, .01f); timer.IsRunning = true; Coefficients coffecients = new Coefficients(/*restitution*/ 1, /*friction*/ .5f); IShape shape1 = new CircleShape(8, 7); IShape shape2 = new PolygonShape(VertexHelper.CreateRectangle(20, 10), 3); Scalar mass = 5; Body body1 = new Body(new PhysicsState(), shape1, mass, coffecients, new Lifespan()); Body body2 = new Body(new PhysicsState(), shape2, mass, coffecients, new Lifespan()); engine.AddBody(body1); engine.AddBody(body2); Joint joint = new HingeJoint(body1, body2, Vector2D.Zero, new Lifespan()); engine.AddJoint(joint); joint.Lifetime.IsExpired = true; engine.AddJoint(new HingeJoint(body1, body2, Vector2D.Zero, new Lifespan())); engine.Update(0, 0); body1.Lifetime.IsExpired = true; timer.IsRunning = false; engine.AddProxy(body1, body2, Matrix2x2.Identity); // b1.RemoveFromProxy(); BinaryFormatter formatter = new BinaryFormatter(); MemoryStream stream = new MemoryStream(); formatter.Serialize(stream, engine); stream.Seek(0, SeekOrigin.Begin); PhysicsEngine engine2 = (PhysicsEngine)formatter.Deserialize(stream); Console.WriteLine(); /* * * Vector2D[] vertexes1 = new Vector2D[] * { * new Vector2D(-1,1), * new Vector2D(-3,1), * new Vector2D(-3,-1), * new Vector2D(-1,-1), * }; * Vector2D[] vertexes2 = new Vector2D[] * { * new Vector2D(1,-1), * new Vector2D(3,-1), * new Vector2D(3,1), * new Vector2D(1,1), * }; * Vector2D[][] polygons = new Vector2D[2][]; * polygons[0] = vertexes1; * polygons[1] = vertexes2; * Console.WriteLine(MultiPartPolygon.GetCentroid(polygons)); * Console.WriteLine(MultiPartPolygon.GetArea(polygons)); */ Console.WriteLine("Finished"); Console.ReadLine(); }
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); }
// Update is called once per frame void Update( ) { Ray ray = _camera.ScreenPointToRay(Input.mousePosition); RaycastHit2D hit = new RaycastHit2D( ); if (!EventSystem.current.IsPointerOverGameObject()) { hit = Physics2D.GetRayIntersection(ray, Mathf.Infinity, _layerMask); } else if (_currentCursor != CursorType.Normal && !Input.GetMouseButton(0)) { Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto); _currentCursor = CursorType.Normal; } if (hit.collider != null) { if (hit.collider.CompareTag("EffectorCenter") && _currentCursor != CursorType.Move) { Cursor.SetCursor(_cursorMove, _cursorMoveHotSpot, CursorMode.Auto); _currentCursor = CursorType.Move; } else if (hit.collider.CompareTag("EffectorOut") && _currentCursor != CursorType.Resize) { Cursor.SetCursor(_cursorResize, _cursorResizeHotSpot, CursorMode.Auto); _currentCursor = CursorType.Resize; } } else if (_currentCursor != CursorType.Normal && !Input.GetMouseButton(0)) { Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto); _currentCursor = CursorType.Normal; } if (Input.GetMouseButtonDown(0)) { if (hit.collider != null) { if (hit.collider.CompareTag("EffectorCenter")) { _effectorTransform = hit.collider.transform.parent; _offset = hit.point - ( Vector2 )_effectorTransform.position; } if (hit.collider.CompareTag("EffectorOut")) { _effectorResizeTransform = hit.collider.transform; _effectorResizeRadiusScript = _effectorResizeTransform.GetComponent <CircleShape>( ); _areaEffector = _effectorResizeTransform.GetComponent <AreaEffector2D>( ); _lastDistanceFromEffector = Vector2.Distance(ray.origin, _effectorResizeTransform.position); } } } if (Input.GetMouseButton(0) && _effectorTransform != null) { _effectorTransform.position = new Vector3(ray.origin.x - _offset.x, ray.origin.y - _offset.y, 0f); } if (Input.GetMouseButton(0) && _effectorResizeTransform != null) { float _distance = Vector2.Distance(ray.origin, _effectorResizeTransform.position); float _difDistance = _lastDistanceFromEffector - _distance; float _newRadius = _effectorResizeRadiusScript.Radius - _difDistance; _newRadius = Mathf.Clamp(_newRadius, _minRadius, _maxRadius); _areaEffector.forceMagnitude = _newRadius * _forceMultiplier; _effectorResizeRadiusScript.Radius = _newRadius; _lastDistanceFromEffector = _distance; } if (Input.GetMouseButtonUp(0)) { _effectorTransform = null; _effectorResizeTransform = null; _effectorResizeRadiusScript = null; _areaEffector = null; } }
private GearsTest() { Body ground = BodyFactory.CreateEdge(World, new Vector2(50.0f, 0.0f), new Vector2(-50.0f, 0.0f)); { CircleShape circle1 = new CircleShape(1.0f, 5f); PolygonShape box = new PolygonShape(5f); box.Vertices = PolygonTools.CreateRectangle(0.5f, 5.0f); CircleShape circle2 = new CircleShape(2.0f, 5f); Body body1 = BodyFactory.CreateBody(World, new Vector2(10.0f, 9.0f)); body1.CreateFixture(circle1); Body body2 = BodyFactory.CreateBody(World, new Vector2(10.0f, 8.0f)); body2.BodyType = BodyType.Dynamic; body2.CreateFixture(box); Body body3 = BodyFactory.CreateBody(World, new Vector2(10.0f, 6.0f)); body3.BodyType = BodyType.Dynamic; body3.CreateFixture(circle2); RevoluteJoint joint1 = new RevoluteJoint(body2, body1, body1.Position, true); World.AddJoint(joint1); RevoluteJoint joint2 = new RevoluteJoint(body2, body3, body3.Position, true); World.AddJoint(joint2); GearJoint joint4 = new GearJoint(body1, body3, joint1, joint2, circle2.Radius / circle1.Radius); World.AddJoint(joint4); } { CircleShape circle1 = new CircleShape(1.0f, 5.0f); CircleShape circle2 = new CircleShape(2.0f, 5.0f); PolygonShape box = new PolygonShape(5f); box.Vertices = PolygonTools.CreateRectangle(0.5f, 5.0f); Body body1 = BodyFactory.CreateBody(World, new Vector2(-3.0f, 12.0f)); body1.BodyType = BodyType.Dynamic; body1.CreateFixture(circle1); _joint1 = new RevoluteJoint(ground, body1, body1.Position, true); _joint1.ReferenceAngle = body1.Rotation - ground.Rotation; World.AddJoint(_joint1); Body body2 = BodyFactory.CreateBody(World, new Vector2(0.0f, 12.0f)); body2.BodyType = BodyType.Dynamic; body2.CreateFixture(circle2); _joint2 = new RevoluteJoint(ground, body2, body2.Position, true); World.AddJoint(_joint2); Body body3 = BodyFactory.CreateBody(World, new Vector2(2.5f, 12.0f)); body3.BodyType = BodyType.Dynamic; body3.CreateFixture(box); _joint3 = new PrismaticJoint(ground, body3, body3.Position, new Vector2(0.0f, 1.0f), true); _joint3.LowerLimit = -5.0f; _joint3.UpperLimit = 5.0f; _joint3.LimitEnabled = true; World.AddJoint(_joint3); _joint4 = new GearJoint(body1, body2, _joint1, _joint2, circle2.Radius / circle1.Radius); World.AddJoint(_joint4); _joint5 = new GearJoint(body2, body3, _joint2, _joint3, -1.0f / circle2.Radius); World.AddJoint(_joint5); } }
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); }
/// <summary> /// Compute contact points for edge versus circle. /// This accounts for edge connectivity. /// </summary> /// <param name="manifold">The manifold.</param> /// <param name="edgeA">The edge A.</param> /// <param name="transformA">The transform A.</param> /// <param name="circleB">The circle B.</param> /// <param name="transformB">The transform B.</param> public static void CollideEdgeAndCircle(ref Manifold manifold, EdgeShape edgeA, ref Transform transformA, CircleShape circleB, ref Transform transformB) { manifold.PointCount = 0; // Compute circle in frame of edge var Q = MathUtils.MulT(ref transformA, MathUtils.Mul(ref transformB, ref circleB._position)); Vector2 A = edgeA.Vertex1, B = edgeA.Vertex2; var e = B - A; // Barycentric coordinates var u = Vector2.Dot(e, B - Q); var v = Vector2.Dot(e, Q - A); var radius = edgeA.Radius + circleB.Radius; ContactFeature cf; cf.IndexB = 0; cf.TypeB = ContactFeatureType.Vertex; // Region A if (v <= 0.0f) { var P1 = A; var d1 = Q - P1; var dd1 = Vector2.Dot(d1, d1); if (dd1 > radius * radius) { return; } // Is there an edge connected to A? if (edgeA.HasVertex0) { var A1 = edgeA.Vertex0; var B1 = A; var e1 = B1 - A1; var u1 = Vector2.Dot(e1, B1 - Q); // Is the circle in Region AB of the previous edge? if (u1 > 0.0f) { return; } } cf.IndexA = 0; cf.TypeA = ContactFeatureType.Vertex; manifold.PointCount = 1; manifold.Type = ManifoldType.Circles; manifold.LocalNormal = Vector2.zero; manifold.LocalPoint = P1; manifold.Points.Value0.Id.Key = 0; manifold.Points.Value0.Id.ContactFeature = cf; manifold.Points.Value0.LocalPoint = circleB.Position; return; } // Region B if (u <= 0.0f) { var P2 = B; var d2 = Q - P2; var dd2 = Vector2.Dot(d2, d2); if (dd2 > radius * radius) { return; } // Is there an edge connected to B? if (edgeA.HasVertex3) { var B2 = edgeA.Vertex3; var A2 = B; var e2 = B2 - A2; var v2 = Vector2.Dot(e2, Q - A2); // Is the circle in Region AB of the next edge? if (v2 > 0.0f) { return; } } cf.IndexA = 1; cf.TypeA = (byte)ContactFeatureType.Vertex; manifold.PointCount = 1; manifold.Type = ManifoldType.Circles; manifold.LocalNormal = Vector2.zero; manifold.LocalPoint = P2; manifold.Points.Value0.Id.Key = 0; manifold.Points.Value0.Id.ContactFeature = cf; manifold.Points.Value0.LocalPoint = circleB.Position; return; } // Region AB var den = Vector2.Dot(e, e); Debug.Assert(den > 0.0f); var P = 1.0f / den * (u * A + v * B); var d = Q - P; var dd = Vector2.Dot(d, d); if (dd > radius * radius) { return; } var n = new Vector2(-e.y, e.x); if (Vector2.Dot(n, Q - A) < 0.0f) { n = new Vector2(-n.x, -n.y); } n.Normalize(); cf.IndexA = 0; cf.TypeA = ContactFeatureType.Face; manifold.PointCount = 1; manifold.Type = ManifoldType.FaceA; manifold.LocalNormal = n; manifold.LocalPoint = A; manifold.Points.Value0.Id.Key = 0; manifold.Points.Value0.Id.ContactFeature = cf; manifold.Points.Value0.LocalPoint = circleB.Position; }
/// <summary> /// 创建一次一定要同步一次 /// </summary> /// <param name="a">释放者unit Id</param> /// <param name="b">碰撞关系数据载体Id(Excel表中的)</param> /// <param name="c">碰撞关系数据载体中的Node的Id</param> /// <param name="d">目标行为树数据载体Id(Excel表中的)</param> public override void Run(long a, int b, long c, int d) { Unit unit = UnitComponent.Instance.Get(a); ConfigComponent configComponent = Game.Scene.GetComponent <ConfigComponent>(); B2S_ColliderComponent colliderComponent = UnitFactory .CreateColliderUnit(unit, configComponent.Get <Server_B2SCollisionRelationConfig>(b).B2S_CollisionRelationId, c) .GetComponent <B2S_ColliderComponent>(); //这里直接默认以英雄当前位置作为碰撞体生成的位置,如需提前指定位置,请在抛事件那里传参 colliderComponent.SyncBody(); //Log.Info("生成技能碰撞体"); //根据传过来的行为树Id来给这个碰撞Unit加上行为树 NP_RuntimeTreeFactory.CreateSkillNpRuntimeTree(colliderComponent.Entity as Unit, configComponent.Get <Server_SkillCanvasConfig>(d).NPBehaveId, configComponent.Get <Server_SkillCanvasConfig>(d).BelongToSkillId) .Start(); //下面这一部分是Debug用的,稳定后请去掉 { //广播碰撞体信息 foreach (var VARIABLE in colliderComponent.Body.FixtureList) { switch (VARIABLE.ShapeType) { case ShapeType.Polygon: //多边形 M2C_B2S_Debugger_Polygon test = new M2C_B2S_Debugger_Polygon() { Id = unit.Id, SustainTime = 2000, }; foreach (var VARIABLE1 in ((PolygonShape)VARIABLE.Shape).Vertices) { Vector2 worldPoint = colliderComponent.Body.GetWorldPoint(VARIABLE1); test.Vects.Add(new M2C_B2S_VectorBase() { X = worldPoint.X, Y = worldPoint.Y }); } MessageHelper.Broadcast(test); break; case ShapeType.Circle: //圆形 CircleShape myShape = (CircleShape)VARIABLE.Shape; M2C_B2S_Debugger_Circle test1 = new M2C_B2S_Debugger_Circle() { Id = unit.Id, SustainTime = 2000, Radius = myShape.Radius, Pos = new M2C_B2S_VectorBase() { X = colliderComponent.Body.GetWorldPoint(myShape.Position).X, Y = colliderComponent.Body.GetWorldPoint(myShape.Position).Y }, }; MessageHelper.Broadcast(test1); //Log.Info($"是圆形,并且已经朝客户端发送绘制数据,半径为{myShape.Radius}"); break; } } } }
static bool collideCircles(CircleShape circleA, ref FSTransform firstTransform, CircleShape circleB, ref FSTransform secondTransform, out FSCollisionResult result) { result = new FSCollisionResult(); Collision.collideCircles(ref _manifold, circleA, ref firstTransform, circleB, ref secondTransform); if (_manifold.pointCount > 0) { // this is essentically directly from ContactSolver.WorldManifold.Initialize. To avoid doing the extra math twice we duplicate this code // here because it doesnt return some values we need to calculate separation var pointA = MathUtils.mul(ref firstTransform, _manifold.localPoint); var pointB = MathUtils.mul(ref secondTransform, _manifold.points[0].localPoint); result.normal = pointA - pointB; Vector2Ext.normalize(ref result.normal); var cA = pointA - circleA.radius * result.normal; var cB = pointB + circleB.radius * result.normal; result.point = 0.5f * (cA + cB); result.point *= FSConvert.simToDisplay; var separation = Vector2.Dot(pointA - pointB, result.normal) - circleA.radius - circleB.radius; result.minimumTranslationVector = result.normal * Math.Abs(separation); #if DEBUG_FSCOLLISIONS Debug.drawPixel(result.point, 5, Color.Red, 0.2f); Debug.drawLine(result.point, result.point + result.normal * 20, Color.Yellow, 0.2f); #endif return(true); } return(false); }
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); }
Cantilever() { Body ground = null; { BodyDef bd = new BodyDef(); 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); } { 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._dynamicBody; bd.Position.Set(-14.5f + 1.0f * i, 5.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); Vec2 anchor = new Vec2(-15.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); m_world.CreateJoint(jd); prevBody = body; } } { PolygonShape shape = new PolygonShape(); shape.SetAsBox(1.0f, 0.125f); FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 20.0f; WeldJointDef jd = new WeldJointDef(); jd.frequencyHz = 5.0f; jd.dampingRatio = 0.7f; Body prevBody = ground; for (int i = 0; i < 3; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(-14.0f + 2.0f * i, 15.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); Vec2 anchor = new Vec2(-15.0f + 2.0f * i, 15.0f); jd.Initialize(prevBody, body, anchor); m_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._dynamicBody; bd.Position.Set(-4.5f + 1.0f * i, 5.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); if (i > 0) { Vec2 anchor = new Vec2(-5.0f + 1.0f * i, 5.0f); jd.Initialize(prevBody, body, anchor); m_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(); jd.frequencyHz = 8.0f; jd.dampingRatio = 0.7f; Body prevBody = ground; for (int i = 0; i < e_count; ++i) { BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(5.5f + 1.0f * i, 10.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); if (i > 0) { Vec2 anchor = new Vec2(5.0f + 1.0f * i, 10.0f); jd.Initialize(prevBody, body, anchor); m_world.CreateJoint(jd); } prevBody = body; } } for (int i = 0; i < 2; ++i) { Vec2[] vertices = new Vec2[3]; vertices[0].Set(-0.5f, 0.0f); vertices[1].Set(0.5f, 0.0f); vertices[2].Set(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._dynamicBody; bd.Position.Set(-8.0f + 8.0f * i, 12.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); } for (int i = 0; i < 2; ++i) { CircleShape shape = new CircleShape(); shape.m_radius = 0.5f; FixtureDef fd = new FixtureDef(); fd.shape = shape; fd.Density = 1.0f; BodyDef bd = new BodyDef(); bd.type = BodyType._dynamicBody; bd.Position.Set(-6.0f + 6.0f * i, 10.0f); Body body = m_world.CreateBody(bd); body.CreateFixture(fd); } }
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)); } } }
BridgeTest() { Body ground; { ground = new Body(World); EdgeShape shape = new EdgeShape(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); ground.CreateFixture(shape); } { Vertices box = PolygonTools.CreateRectangle(0.5f, 0.125f); PolygonShape shape = new PolygonShape(box, 20); Body prevBody = ground; for (int i = 0; i < Count; ++i) { Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-14.5f + 1.0f * i, 5.0f); Fixture fixture = body.CreateFixture(shape); fixture.Friction = 0.2f; Vector2 anchor = new Vector2(-15f + 1.0f * i, 5.0f); RevoluteJoint jd = new RevoluteJoint(prevBody, body, anchor, true); World.AddJoint(jd); prevBody = body; } Vector2 anchor2 = new Vector2(-15.0f + 1.0f * Count, 5.0f); RevoluteJoint jd2 = new RevoluteJoint(ground, prevBody, anchor2, true); World.AddJoint(jd2); } Vertices vertices = new Vertices(3); vertices.Add(new Vector2(-0.5f, 0.0f)); vertices.Add(new Vector2(0.5f, 0.0f)); vertices.Add(new Vector2(0.0f, 1.5f)); for (int i = 0; i < 2; ++i) { PolygonShape shape = new PolygonShape(vertices, 1); Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-8.0f + 8.0f * i, 12.0f); body.CreateFixture(shape); } for (int i = 0; i < 3; ++i) { CircleShape shape = new CircleShape(0.5f, 1); Body body = BodyFactory.CreateBody(World); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-6.0f + 6.0f * i, 10.0f); body.CreateFixture(shape); } }
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 StarMenuControl(Star objStar) { BodyComponentList = new List <Drawable>(); float fltStarRad = objStar.Radius; Vector2f vecStarCenter = objStar.Position; float fltStarCenterX = vecStarCenter.X + fltStarRad; float fltStarCenterY = vecStarCenter.Y + fltStarRad; CircleShape objCenterCirc = new CircleShape(fltStarRad + 10); objCenterCirc.OutlineColor = Color.Blue; objCenterCirc.OutlineThickness = 2; objCenterCirc.FillColor = Color.Transparent; float fltCenterCircX = fltStarCenterX - objCenterCirc.Radius; float fltCenterCircY = fltStarCenterY - objCenterCirc.Radius; objCenterCirc.Position = new Vector2f(fltCenterCircX, fltCenterCircY); this.BodyComponentList.Add(objCenterCirc); float fltCenterCircOffset = fltStarRad + 10; float fltHorizontalBarX = 50; float fltLineOffsetX = fltCenterCircOffset + fltHorizontalBarX; Vector2f vecVertex1 = new Vector2f(fltStarCenterX, fltStarCenterY - fltCenterCircOffset); Vector2f vecVertex2 = new Vector2f(fltStarCenterX - fltLineOffsetX, fltStarCenterY - 100); Vector2f vecVertex3 = new Vector2f(fltStarCenterX - fltLineOffsetX, fltStarCenterY + 100); Vector2f vecVertex4 = new Vector2f(fltStarCenterX, fltStarCenterY + fltCenterCircOffset); HorizontalLine1 = new Vertex[] { new Vertex(vecVertex1, Color.Blue), new Vertex(vecVertex2, Color.Blue), new Vertex(vecVertex3, Color.Blue), new Vertex(vecVertex4, Color.Blue) }; float fltRecHeight = 200; RectangleShape recDetails = new RectangleShape(new Vector2f(200, fltRecHeight)); recDetails.FillColor = new Color(50, 170, 255, 50); recDetails.OutlineColor = Color.Blue; recDetails.OutlineThickness = 2; recDetails.Position = new Vector2f(vecVertex2.X - 200, vecVertex2.Y); BodyComponentList.Add(recDetails); int intOrbitalCount = 0; if (objStar.ChildOrbits != null) { intOrbitalCount = objStar.ChildOrbits.Length; } string strText = $"Name: {objStar.SystemName}\r\nType: {objStar.StarType}\r\nMajor Orbitals: {intOrbitalCount}"; Text objDetailText = new Text(strText, new Font(Engine.Instance.fontStream)); objDetailText.Position = new Vector2f(recDetails.Position.X + 5, recDetails.Position.Y + 5); objDetailText.CharacterSize = 11; BodyComponentList.Add(objDetailText); }
public RayCast() { // Ground body { 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); } { var 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); _polygons[0] = new PolygonShape(); _polygons[0].Set(vertices, 3); } { var vertices2 = new Vector2[3]; vertices2[0] = new Vector2(-0.1f, 0.0f); vertices2[1] = new Vector2(0.1f, 0.0f); vertices2[2] = new Vector2(0.0f, 1.5f); _polygons[1] = new PolygonShape(); _polygons[1].Set(vertices2, 3); } { float w = 1.0f; float b = w / (2.0f + (float)Math.Sqrt(2.0)); float s = (float)Math.Sqrt(2.0) * b; var vertices3 = new Vector2[8]; vertices3[0] = new Vector2(0.5f * s, 0.0f); vertices3[1] = new Vector2(0.5f * w, b); vertices3[2] = new Vector2(0.5f * w, b + s); vertices3[3] = new Vector2(0.5f * s, w); vertices3[4] = new Vector2(-0.5f * s, w); vertices3[5] = new Vector2(-0.5f * w, b + s); vertices3[6] = new Vector2(-0.5f * w, b); vertices3[7] = new Vector2(-0.5f * s, 0.0f); _polygons[2] = new PolygonShape(); _polygons[2].Set(vertices3, 8); } { _polygons[3] = new PolygonShape(); _polygons[3].SetAsBox(0.5f, 0.5f); } { _circle = new CircleShape(); _circle._radius = 0.5f; } _bodyIndex = 0; _angle = 0.0f; _mode = RayCastMode.Closest; }
private CollisionProcessingTest() { //Ground BodyFactory.CreateEdge(World, new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); const float xLo = -5.0f; const float xHi = 5.0f; const float yLo = 2.0f; const float yHi = 35.0f; // Small triangle Vertices vertices = new Vertices(3); vertices.Add(new Vector2(-1.0f, 0.0f)); vertices.Add(new Vector2(1.0f, 0.0f)); vertices.Add(new Vector2(0.0f, 2.0f)); PolygonShape polygon = new PolygonShape(vertices, 1); Body body1 = BodyFactory.CreateBody(World); body1.BodyType = BodyType.Dynamic; body1.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); Fixture fixture = body1.CreateFixture(polygon); fixture.OnCollision += OnCollision; // Large triangle (recycle definitions) vertices[0] *= 2.0f; vertices[1] *= 2.0f; vertices[2] *= 2.0f; polygon.Vertices = vertices; Body body2 = BodyFactory.CreateBody(World); body2.BodyType = BodyType.Dynamic; body2.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); fixture = body2.CreateFixture(polygon); fixture.OnCollision += OnCollision; // Small box Vertices smallBox = PolygonUtils.CreateRectangle(1.0f, 0.5f); polygon.Vertices = smallBox; Body body3 = BodyFactory.CreateBody(World); body3.BodyType = BodyType.Dynamic; body3.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); fixture = body3.CreateFixture(polygon); fixture.OnCollision += OnCollision; // Large box (recycle definitions) Vertices largeBox = PolygonUtils.CreateRectangle(2.0f, 1.0f); polygon.Vertices = largeBox; Body body4 = BodyFactory.CreateBody(World); body4.BodyType = BodyType.Dynamic; body4.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); fixture = body4.CreateFixture(polygon); fixture.OnCollision += OnCollision; // Small circle CircleShape circle = new CircleShape(1.0f, 1); Body body5 = BodyFactory.CreateBody(World); body5.BodyType = BodyType.Dynamic; body5.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); fixture = body5.CreateFixture(circle); fixture.OnCollision += OnCollision; // Large circle circle.Radius *= 2.0f; Body body6 = BodyFactory.CreateBody(World); body6.BodyType = BodyType.Dynamic; body6.Position = new Vector2(Rand.RandomFloat(xLo, xHi), Rand.RandomFloat(yLo, yHi)); fixture = body6.CreateFixture(circle); fixture.OnCollision += OnCollision; }
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); }
private CantileverTest() { Body ground = World.CreateEdge(new Vector2(-40, 0), new Vector2(40, 0)); { PolygonShape shape = new PolygonShape(20); shape.Vertices = PolygonTools.CreateRectangle(0.5f, 0.125f); Body prevBody = ground; for (int i = 0; i < Count; ++i) { Body body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-14.5f + 1.0f * i, 5.0f); body.CreateFixture(shape); Vector2 anchor = new Vector2(-15.0f + 1.0f * i, 5.0f); WeldJoint jd = new WeldJoint(prevBody, body, anchor, anchor, true); World.Add(jd); prevBody = body; } } { PolygonShape shape = new PolygonShape(20f); shape.Vertices = PolygonTools.CreateRectangle(1f, 0.125f); Body prevBody = ground; for (int i = 0; i < 3; ++i) { Body body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-14.0f + 2.0f * i, 15.0f); body.CreateFixture(shape); Vector2 anchor = new Vector2(-15.0f + 2.0f * i, 15.0f); WeldJoint jd = new WeldJoint(prevBody, body, anchor, anchor, true); jd.FrequencyHz = 5.0f; jd.DampingRatio = 0.7f; World.Add(jd); prevBody = body; } } { PolygonShape shape = new PolygonShape(20f); shape.Vertices = PolygonTools.CreateRectangle(0.5f, 0.125f); Body prevBody = ground; for (int i = 0; i < Count; ++i) { Body body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-4.5f + 1.0f * i, 5.0f); body.CreateFixture(shape); if (i > 0) { Vector2 anchor = new Vector2(-5.0f + 1.0f * i, 5.0f); WeldJoint jd = new WeldJoint(prevBody, body, anchor, anchor, true); World.Add(jd); } prevBody = body; } } { PolygonShape shape = new PolygonShape(20f); shape.Vertices = PolygonTools.CreateRectangle(0.5f, 0.125f); Body prevBody = ground; for (int i = 0; i < Count; ++i) { Body body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(5.5f + 1.0f * i, 10.0f); body.CreateFixture(shape); if (i > 0) { Vector2 anchor = new Vector2(5.0f + 1.0f * i, 10.0f); WeldJoint jd = new WeldJoint(prevBody, body, anchor, anchor, true); jd.FrequencyHz = 8.0f; jd.DampingRatio = 0.7f; World.Add(jd); } prevBody = body; } } //Triangels Vertices vertices = new Vertices(3); vertices.Add(new Vector2(-0.5f, 0.0f)); vertices.Add(new Vector2(0.5f, 0.0f)); vertices.Add(new Vector2(0.0f, 1.5f)); for (int i = 0; i < 2; ++i) { PolygonShape shape = new PolygonShape(vertices, 1); Body body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-8.0f + 8.0f * i, 12.0f); body.CreateFixture(shape); } //Circles for (int i = 0; i < 2; ++i) { CircleShape shape = new CircleShape(0.5f, 1); Body body = World.CreateBody(); body.BodyType = BodyType.Dynamic; body.Position = new Vector2(-6.0f + 6.0f * i, 10.0f); body.CreateFixture(shape); } }