public static List <Body> AddPyramid(DemoOpenInfo info, IShape shape, Scalar mass, BoundingRectangle rect, Scalar xSpacing, Scalar ySpacing) { BoundingRectangle shapeRect; Matrix2x3 ident = Matrix2x3.Identity; shape.CalcBoundingRectangle(ref ident, out shapeRect); Vector2D size = shapeRect.Max - shapeRect.Min; Vector2D spacing = new Vector2D(xSpacing, ySpacing) + size; Vector2D end = rect.Max - size * .5f; Vector2D begin = rect.Min + size * .5f; Vector2D center = (end + begin) * .5f; List <Body> result = new List <Body>(); for (int row = 1; begin.Y + row * spacing.Y < end.Y; row++) { Scalar start = center.X - ((spacing.X * row - 1) * .5f); for (int column = 0; column < row; ++column) { Vector2D pos = new Vector2D(start + spacing.X * column, row * spacing.Y + begin.Y); if (pos.X > begin.X && pos.X <= end.X) { result.Add(AddShape(info, shape, mass, new ALVector2D(0, pos))); } } } return(result); }
/// <summary> /// Updates all the values caluclated from the State.Position. /// Re-calculates the Matrices property the re-calculates the Rectangle property /// from that. /// </summary> public void ApplyPosition() { MathHelper.ClampAngle(ref state.Position.Angular); Matrix2x3 matrix; ALVector2D.ToMatrix2x3(ref state.Position, out matrix); Matrix2x3.Multiply(ref matrix, ref transformation, out matrix); matrices.SetToWorld(ref matrix); shape.CalcBoundingRectangle(ref matrix, out rectangle); if (engine == null || !engine.inUpdate) { OnPositionChanged(); } }
public static List <Body> AddGrid(DemoOpenInfo info, IShape shape, Scalar mass, BoundingRectangle rect, Scalar xSpacing, Scalar ySpacing) { BoundingRectangle shapeRect; Matrix2x3 ident = Matrix2x3.Identity; shape.CalcBoundingRectangle(ref ident, out shapeRect); Vector2D size = shapeRect.Max - shapeRect.Min; Vector2D spacing = new Vector2D(xSpacing, ySpacing) + size; Vector2D end = rect.Max - size * .5f; Vector2D begin = rect.Min + size * .5f; Vector2D pos; List <Body> result = new List <Body>(); for (pos.X = begin.X; pos.X <= end.X; pos.X += spacing.X) { for (pos.Y = begin.Y; pos.Y <= end.Y; pos.Y += spacing.Y) { result.Add(AddShape(info, shape, mass, new ALVector2D(0, pos))); } } return(result); }
public static List<Body> AddPyramid(DemoOpenInfo info, IShape shape, Scalar mass, BoundingRectangle rect, Scalar xSpacing, Scalar ySpacing) { BoundingRectangle shapeRect; Matrix2x3 ident = Matrix2x3.Identity; shape.CalcBoundingRectangle(ref ident, out shapeRect); Vector2D size = shapeRect.Max - shapeRect.Min; Vector2D spacing = new Vector2D(xSpacing, ySpacing) + size; Vector2D end = rect.Max - size * .5f; Vector2D begin = rect.Min + size * .5f; Vector2D center = (end + begin) * .5f; List<Body> result = new List<Body>(); for (int row = 1; begin.Y + row * spacing.Y < end.Y; row++) { Scalar start = center.X - ((spacing.X * row - 1) * .5f); for (int column = 0; column < row; ++column) { Vector2D pos = new Vector2D(start + spacing.X * column, row * spacing.Y + begin.Y); if (pos.X > begin.X && pos.X <= end.X) { result.Add(AddShape(info, shape, mass, new ALVector2D(0, pos))); } } } return result; }
public static List<Body> AddGrid(DemoOpenInfo info, IShape shape, Scalar mass, BoundingRectangle rect, Scalar xSpacing, Scalar ySpacing) { BoundingRectangle shapeRect; Matrix2x3 ident = Matrix2x3.Identity; shape.CalcBoundingRectangle(ref ident, out shapeRect); Vector2D size = shapeRect.Max - shapeRect.Min; Vector2D spacing = new Vector2D(xSpacing, ySpacing) + size; Vector2D end = rect.Max - size * .5f; Vector2D begin = rect.Min + size * .5f; Vector2D pos; List<Body> result = new List<Body>(); for (pos.X = begin.X; pos.X <= end.X; pos.X += spacing.X) { for (pos.Y = begin.Y; pos.Y <= end.Y; pos.Y += spacing.Y) { result.Add(AddShape(info, shape, mass, new ALVector2D(0, pos))); } } return result; }
public static DisposeCallback CreateTank(DemoOpenInfo info, Vector2D position, List <Body> result) { Lifespan avatarLifespan = new Lifespan(); IShape shape = ShapeFactory.CreateSprite(Cache <SurfacePolygons> .GetItem("tank.png"), 4, 18, 2); ObjectIgnorer ignorer = new ObjectIgnorer(); Body tankBody = new Body(new PhysicsState(new ALVector2D(0, 0, 0)), shape, 300,//new MassInfo(40, Scalar.PositiveInfinity), new Coefficients(0, 1), avatarLifespan); result.Add(tankBody); tankBody.State.Position.Linear += position; tankBody.ApplyPosition(); tankBody.CollisionIgnorer = ignorer; BodyGraphic graphic = CreateGraphic(tankBody); graphic.ZOrder = 2; info.Scene.AddGraphic(graphic); Scalar wheelSize = 18; Scalar wheelSpacing = -9; Scalar lenghtPercent = .84f; Matrix2x3 ident = Matrix2x3.Identity; BoundingRectangle rect; shape.CalcBoundingRectangle(ref ident, out rect); Scalar y = (rect.Max.Y + 4); Body lastWheel = null; BoundingPolygon polygon = new BoundingPolygon(shape.Vertexes); Ray ray2 = new Ray(new Vector2D(rect.Max.X, y), -Vector2D.YAxis); Scalar y3 = y - polygon.Intersects(ray2); Vector2D avatarBarrelOffset = new Vector2D(rect.Max.X + 10, y3); CircleShape wheelShape = ShapeFactory.CreateColoredCircle(wheelSize, 30); Scalar force = 0; for (Scalar x = rect.Min.X + wheelSize; x < (rect.Max.X - wheelSize) * lenghtPercent; x += (wheelSize * 2 + wheelSpacing)) { Ray ray = new Ray(new Vector2D(x, y), -Vector2D.YAxis); Scalar y2 = y - polygon.Intersects(ray); Vector2D offset = new Vector2D(x, y2); Body wheel = new Body( new PhysicsState(new ALVector2D(0, offset + position)), wheelShape, 10, new Coefficients(0, 3),// coefficients.Duplicate(), avatarLifespan); result.Add(wheel); wheel.CollisionIgnorer = ignorer; wheel.AngularDamping = .9f; wheel.Updated += delegate(object sender, UpdatedEventArgs e) { wheel.State.ForceAccumulator.Angular += force; }; info.Scene.AddGraphic(CreateGraphic(wheel)); HingeJoint joint = new HingeJoint(tankBody, wheel, offset + position, avatarLifespan); joint.Softness = .1f; info.Scene.Engine.AddJoint(joint); if (lastWheel != null) { AngleJoint joint2 = new AngleJoint(lastWheel, wheel, avatarLifespan); info.Scene.Engine.AddJoint(joint2); } lastWheel = wheel; } CircleShape weaponShape = ShapeFactory.CreateColoredCircle(5, 8); //now begins the abuse of anominous delegates (BIG TIME) EventHandler <KeyboardEventArgs> keyDownHandler = delegate(object sender, KeyboardEventArgs e) { switch (e.Key) { case Key.LeftArrow: force = -1500000; break; case Key.RightArrow: force = 1500000; break; case Key.Space: Scalar velocity = 2000; Matrix2x3 toWorld = tankBody.Matrices.ToWorld; Matrix2x2 toWorldNormal = tankBody.Matrices.ToWorldNormal; // Matrix2D mat = avatarBodies[0].Matrices.ToWorld; Vector2D direction = toWorldNormal * Vector2D.XAxis; PhysicsState state = new PhysicsState(); state.Position.Linear = toWorld * (avatarBarrelOffset); state.Velocity.Linear = velocity * direction + tankBody.State.Velocity.Linear; Body weapon = new Body(state, weaponShape, 5, new Coefficients(1, 1), new Lifespan(10)); //weapon.CollisionIgnorer = tankBody.CollisionIgnorer; weapon.Collided += delegate(object sender2, CollisionEventArgs e2) { if (!weapon.Lifetime.IsExpired) { weapon.Lifetime.IsExpired = true; AddParticles(info, weapon.State.Position.Linear, weapon.State.Velocity.Linear * .5f, 50); } }; // weapon.Collided += weapon_Collided; tankBody.State.Velocity.Linear -= (velocity * weapon.Mass.Mass * tankBody.Mass.MassInv) * direction; info.Scene.AddGraphic(CreateGraphic(weapon)); break; } }; EventHandler <KeyboardEventArgs> keyUpHandler = delegate(object sender, KeyboardEventArgs e) { switch (e.Key) { case Key.LeftArrow: force = 0; break; case Key.RightArrow: force = 0; break; } }; Events.KeyboardDown += keyDownHandler; Events.KeyboardUp += keyUpHandler; return(delegate() { Events.KeyboardDown -= keyDownHandler; Events.KeyboardUp -= keyUpHandler; }); }