private void addBaffle(Body body) { try { if (body.GetUserData() == null) { return; } GizmoComponents myGizmo = (GizmoComponents)body.GetUserData(); //添加Shape addPolygon(body); //添加旋转关节 BodyDef kinematicBodyDef = new BodyDef(); Vec2 position = GizmoShape.PointRotate(new Vec2(myGizmo.PositionX, myGizmo.PositionY), new Vec2(myGizmo.PositionX + myGizmo.Width, myGizmo.PositionY), System.Math.PI * 2 - myGizmo.Angle / 180 * System.Math.PI); kinematicBodyDef.Position.Set(position.X, position.Y); Body kinematicBody = myWorld.CreateBody(kinematicBodyDef); RevoluteJointDef jointDef = new RevoluteJointDef(); switch ((int)myGizmo.Angle) { case 0: jointDef.LowerAngle = -1.57f; //最小角 jointDef.UpperAngle = 0; //最大角 break; case 90: jointDef.LowerAngle = -1.57f; //最小角 jointDef.UpperAngle = 1.57f; //最大角 break; case 180: jointDef.LowerAngle = 0f; //最小角 jointDef.UpperAngle = 1.57f; //最大角 break; case 270: jointDef.LowerAngle = 0f; //最小角 jointDef.UpperAngle = 1.57f; //最大角 break; } jointDef.EnableLimit = true; jointDef.MaxMotorTorque = 100.0f; jointDef.MotorSpeed = 0.0f; jointDef.EnableMotor = true; jointDef.Initialize(body, kinematicBody, position); RevoluteJoint joint = (RevoluteJoint)myWorld.CreateJoint(jointDef); } catch (Exception e) { MessageBox.Show("PhysicalWorld-addBaffleX函数出错"); } }
public void draw(World world, Graphics g) { Body b = world.GetBodyList(); int i = 0; do { SolidBrush brush; if (b.GetUserData() == null) { i++; b = b.GetNext(); continue; } GizmoComponents GComp = (GizmoComponents)b.GetUserData(); switch (GComp.Attribute) { case GizmoAttribute.pineBall: brush = new SolidBrush(System.Drawing.Color.LawnGreen); break; case GizmoAttribute.staticGizmo: brush = new SolidBrush(System.Drawing.Color.LightBlue); break; case GizmoAttribute.absorber: brush = new SolidBrush(System.Drawing.Color.Red); break; case GizmoAttribute.dynamicGizmo: brush = new SolidBrush(System.Drawing.Color.Yellow); break; case GizmoAttribute.track: brush = new SolidBrush(System.Drawing.Color.Brown); break; case GizmoAttribute.baffle: brush = new SolidBrush(System.Drawing.Color.Gray); break; default: brush = new SolidBrush(System.Drawing.Color.Black); break; } if (GComp == null) { continue; } switch (GComp.Shape) { case GizmoType.Circle: g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; g.FillEllipse(brush, (b.GetPosition().X - GComp.Radius) * Scale, (b.GetPosition().Y - GComp.Radius) * Scale, GComp.Radius * 2 * Scale, GComp.Radius * 2 * Scale); break; case GizmoType.Rectangle: g.FillRectangle(brush, (b.GetPosition().X - GComp.Width) * Scale + 1, (b.GetPosition().Y - GComp.Height) * Scale + 1, (GComp.Width) * Scale * 2 - 1, (GComp.Height) * Scale * 2 - 1); break; case GizmoType.BaffleX: case GizmoType.Baffle: case GizmoType.Polygon: g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; g.FillPolygon(brush, GizmoShape.getBodyPoint(b, Scale).ToArray()); break; } i++; b = b.GetNext(); } while (i < world.GetBodyCount() - 1); }