Example #1
0
        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);
        }
Example #2
0
        /// <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();
            }
        }
Example #3
0
        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);
        }
Example #4
0
        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;
        }
Example #5
0
 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;
 }
Example #6
0
        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;
            });
        }