Проблема столкновения XNA 3.1 - PullRequest
1 голос
/ 22 марта 2012

Так вот в чем моя проблема. У меня есть коробка, в которой я хочу, чтобы мой персонаж перемещался. Но я хочу иметь возможность перемещаться, удерживая, например, несколько команд перемещения. при движении вправо (к левому краю препятствия) я хочу иметь возможность удерживать движение вправо и вверх или вниз без одновременного прилипания персонажа к коробке Самое смешное, что он отлично работает для левой и правой стороны препятствия, но прилипает, когда я пробую его на верхней и нижней стороне препятствия. Вот класс игрока (объект, который я двигаю)

<!-- language: c# -->
    public class Player
{
    public Texture2D texture;
    public Vector2 position;
    public int speed;
    public Vector2 offset;
    public bool left, right, up, down;
    public Rectangle collisionRect
    {
        get
        {
            return new Rectangle((int)position.X , (int)position.Y, texture.Width, texture.Height);
        }
    }
    public Vector2 direction;
    public Player(Texture2D texture, Vector2 position, int speed)
    {
        this.texture = texture;
        this.position = position;
        this.speed = speed;
        offset.X = speed;
        offset.Y = speed;
        left = false;
        right = false;
        up = false;
        down = false;
    }
    public virtual void Update(GameTime gameTime, Rectangle clientBounds)
    {
        direction = Vector2.Zero;
        if (Keyboard.GetState().IsKeyDown(Keys.A))
        {
            direction.X -= 1;
            left = true;
        }
        else
            left = false;
        if (Keyboard.GetState().IsKeyDown(Keys.D))
        {
            direction.X += 1;
            right = true;
        }
        else
            right = false;
        if (Keyboard.GetState().IsKeyDown(Keys.W))
        {
            direction.Y -= 1;
            up = true;
        }
        else
            up = false;
        if (Keyboard.GetState().IsKeyDown(Keys.S))
        {
            direction.Y += 1;
            down = true;
        }
        else
            down = false;

        position += (direction * speed);
    }
    public virtual void Draw(GameTime gameTime, SpriteBatch spritebatch)
    {
        spritebatch.Draw(texture, collisionRect, Color.White);
    }
}

Вот метод обновления в моем maingame

    <!-- language: c# -->
    public override void Update(GameTime gameTime)
    {
        // TODO: Add your update code here
        player.Update(gameTime, Game.Window.ClientBounds);

        if (player.right && HitWall(player))
        {
            player.position.X -= player.offset.X;
        }
        else if (player.left && HitWall(player))
        {
            player.position.X += player.offset.X;
        }
        if (player.down && HitWall(player))
        {
            player.position.Y -= player.offset.Y;
        }
        else if (player.up && HitWall(player))
        {
            player.position.Y += player.offset.Y;
        }
        base.Update(gameTime);
    }

И функция HitWall

    <!-- language: c# -->
    public bool HitWall(Player player)
    {
        for (int i = player.collisionRect.Top; i < player.collisionRect.Bottom; i++)
            for (int j = player.collisionRect.Left; j < player.collisionRect.Right; j++)
                if (TextureData[i * gameMap.map.Width + j] != Color.White)
                    return true;
        return false;
    }

1 Ответ

0 голосов
/ 22 марта 2012

Я не уверен, где определено смещение, но я предполагаю, что это движение, которое вы только что сделали в этом кадре.

Ваша проблема в том, что вы проверяете влево и вправо, прежде чем вверх и вниз,если вы двигаетесь по диагонали вниз к верхнему краю коробки, то вы зарегистрируете попадание в направлении Y - HitWall не проверяет, в каком направлении вы движетесь, оно просто проверяет наличие столкновения.Поэтому столкновение по оси Y все еще считается на линии if (player.right && HitWall(player)) и останавливает ваше боковое движение.

Лучше всего применить боковое движение, проверить попадание, отойти назад, если оно есть, - тогдапримените движение вниз, проверьте попадание и вернитесь назад, если оно есть.Корректировка положения должна означать, что вы скользите по сторонам так, как хотите.

...