Ejemplo n.º 1
0
        private Point2I ledgeTileLocation;                                      // The tile location of the ledge we are currently passing over, or (-1, -1) if not passing over ledge.


        //-----------------------------------------------------------------------------
        // Constructors
        //-----------------------------------------------------------------------------

        // By default, physics are disabled.
        public PhysicsComponent(Entity entity)
        {
            this.isEnabled                = false;
            this.flags                    = PhysicsFlags.None;
            this.entity                   = entity;
            this.velocity                 = Vector2F.Zero;
            this.zVelocity                = 0.0f;
            this.previousVelocity         = Vector2F.Zero;
            this.previousZVelocity        = 0.0f;
            this.gravity                  = GameSettings.DEFAULT_GRAVITY;
            this.maxFallSpeed             = GameSettings.DEFAULT_MAX_FALL_SPEED;
            this.collisionBox             = new Rectangle2F(-1, -1, 2, 2);
            this.softCollisionBox         = new Rectangle2F(-1, -1, 2, 2);
            this.topTile                  = null;
            this.isColliding              = false;
            this.autoDodgeDistance        = 6;
            this.autoDodgeSpeed           = 1.0f;
            this.hasLanded                = false;
            this.reboundVelocity          = Vector2F.Zero;
            this.ledgeAltitude            = 0;
            this.ledgeTileLocation        = new Point2I(-1, -1);
            this.roomEdgeCollisionBoxType = CollisionBoxType.Hard;

            this.crushMaxGapSize = 0;
            this.edgeClipAmount  = 1;

            this.collisionInfo         = new CollisionInfo[Directions.Count];
            this.previousCollisionInfo = new CollisionInfo[Directions.Count];
            for (int i = 0; i < Directions.Count; i++)
            {
                collisionInfo[i].Clear();
                previousCollisionInfo[i].Clear();
            }

            this.MovementCollisions = new bool[4];
            this.ClipCollisionInfo  = new CollisionInfoNew[4];
            for (int i = 0; i < 4; i++)
            {
                ClipCollisionInfo[i] = new CollisionInfoNew();
            }
        }
Ejemplo n.º 2
0
        private static void DrawEntity(Graphics2D g, Entity entity)
        {
            if (EntityDebugInfoMode == EntityDrawInfo.CollisionBoxes)
            {
                g.FillRectangle(entity.Physics.SoftCollisionBox + entity.Position, new Color(0, 0, 255, 150));
                g.FillRectangle(entity.Physics.CollisionBox + entity.Position, new Color(255, 0, 0, 150));
                g.FillRectangle(new Rectangle2F(entity.Position, Vector2F.One), new Color(255, 255, 0));

                if (entity is Unit)
                {
                    Unit unit = (Unit)entity;
                    foreach (UnitTool tool in unit.EquippedTools)
                    {
                        if (tool.IsPhysicsEnabled)
                        {
                            g.FillRectangle(tool.PositionedCollisionBox, new Color(255, 0, 255, 150));
                        }
                    }
                }
            }
            else if (EntityDebugInfoMode == EntityDrawInfo.CollisionTests)
            {
                if (entity.Physics.IsEnabled && entity.Physics.CollideWithWorld || entity is Player)
                {
                    // Draw the hard collision box.
                    Rectangle2F collisionBox      = entity.Physics.PositionedCollisionBox;
                    Color       collisionBoxColor = Color.Yellow;
                    if (entity is Player && ((Player)entity).Movement.IsOnSideScrollLadder)
                    {
                        collisionBoxColor = new Color(255, 160, 0);
                    }
                    collisionBox.X = GMath.Round(collisionBox.X + 0.001f);
                    collisionBox.Y = GMath.Round(collisionBox.Y + 0.001f);
                    //collisionBox.Point = GMath.Round(collisionBox.Point);
                    g.FillRectangle(collisionBox, collisionBoxColor);

                    for (int i = 0; i < 4; i++)
                    {
                        CollisionInfoNew collisionInfo = entity.Physics.ClipCollisionInfo[i];
                        int axis = Directions.ToAxis(i);

                        if (entity.Physics.CollisionInfo[i].IsColliding)
                        {
                            Rectangle2F drawBox = collisionBox;
                            drawBox.ExtendEdge(i, 1);
                            drawBox.ExtendEdge(Directions.Reverse(i), -collisionBox.Size[axis]);
                            g.FillRectangle(drawBox, Color.Magenta);
                        }

                        if (collisionInfo.IsColliding && !collisionInfo.IsResolved)
                        {
                            Rectangle2F drawBox     = collisionBox;
                            float       penetration = Math.Max(1.0f, GMath.Round(collisionInfo.PenetrationDistance));
                            if (i == Directions.Down || i == Directions.Right)
                            {
                                drawBox.Point[axis] += drawBox.Size[axis] - penetration;
                            }
                            drawBox.Size[axis] = penetration;

                            // Draw the strip of penetration.
                            Color penetrationColor = Color.Red;
                            if (entity.Physics.AllowEdgeClipping && collisionInfo.IsAllowedClipping)
                            {
                                penetrationColor = Color.Blue;
                            }
                            g.FillRectangle(drawBox, penetrationColor);
                        }
                        if (collisionInfo.IsColliding && collisionInfo.IsResolved)
                        {
                            Rectangle2F drawBox2 = collisionBox;
                            drawBox2.ExtendEdge(i, 2);
                            drawBox2.ExtendEdge(Directions.Reverse(i), -collisionBox.Size[axis] - 1);
                            g.FillRectangle(drawBox2, Color.Maroon);
                        }
                    }
                }
                else if (entity.Physics.IsEnabled && entity.Physics.IsSolid)
                {
                    // Draw the hard collision box.
                    Rectangle2F collisionBox = entity.Physics.PositionedCollisionBox;
                    g.FillRectangle(collisionBox, Color.Olive);
                }
            }
        }