2

我被困在试图弄清楚如何改变我的碰撞检测以使其正常工作,我将所有墙壁对象堆叠在一个列表中,然后当玩家移动时,我循环遍历每个墙壁对象并调用 DetectCollision 方法,这将返回 true 或 false取决于物体是否在墙内。

墙壁检测碰撞(X和Y坐标是墙壁的位置)

public bool DetectCollision(float x, float y)
    {
        if ((x >= this.XCoordinate && x <= (this.XCoordinate + this.BlockWidth)) && (y >= this.YCoordinate && y <= (this.YCoordinate + this.BlockHeight)))
            return true;            
        else
            return false;
    }

因此,在我的播放器功能中,当玩家尝试移动时,我将移动添加到临时 X、Y 坐标并检查它们是否与墙壁碰撞,如果它们什么也没发生,否则我移动播放器。

但我注意到它不能正常工作,如果我在游戏场内添加一块墙,它只会检查右下角的碰撞检测?

玩家移动方式:

        float x, y;
        if (direction == Direction.E)
        {
            x = LiveObjects.player.XCoordinate - MovementSpeed;
            y = LiveObjects.player.YCoordinate;
        }
        else if (direction == Direction.W)
        {
            x = LiveObjects.player.XCoordinate + MovementSpeed;
            y = LiveObjects.player.YCoordinate;
        }
        else if (direction == Direction.N)
        {
            x = LiveObjects.player.XCoordinate;
            y = LiveObjects.player.YCoordinate - MovementSpeed;
        }
        else
        {
            x = LiveObjects.player.XCoordinate;
            y = LiveObjects.player.YCoordinate + MovementSpeed;
        }

        if (GameMechanics.DetectWallCollision(x, y) || GameMechanics.DetectWallCollision((x + LiveObjects.player.BlockWidth), (y + LiveObjects.player.BlockHeight))
        {
            OnPlayerInvalidMove(null, new PlayerEventArgs());
            return;
        }

DetectWallCollision 的循环只是:

foreach (Wall wall in LiveObjects.walls)
        {
            if (wall.DetectCollision(x, y))
                return true;
        }
        return false;

有任何想法吗?

4

3 回答 3

1

我假设您的世界中没有任何东西是无限小的(即像素大小)。要进行真正的边界框碰撞,您必须考虑两个对象的大小,而不仅仅是一个。

boolean intersectsEntity(Entity e)
{
    return (e.position.x <= position.x + size.x) &&
           (e.position.y <= position.y + size.y) &&
           (e.position.x + e.size.x >= position.x) &&
           (e.position.y + e.size.y >= position.y);
}

这当然是假设一个实体有一个向量来表示它的位置和大小。所以 size.x == 宽度和 size.y == 高度。

于 2009-08-19T20:27:33.460 回答
0

有些事情让我感到不安,您说 DetectCollision 方法获取墙的位置 - 但如果我正确解释您的代码,您将 x 和 y 参数交给 DetectWallCollision,这是玩家和手的位置(移动后)该位置下降到 DetectCollision 方法...

您是否调试过代码以查看将哪些坐标传递给碰撞方法并跟踪您的 if 语句的路径?

如果由于某种原因无法调试您的代码 - 编写跟踪文件 - 我认为解决方案将落入您的手中;)

于 2009-08-19T10:51:49.440 回答
0

你的东方和西方是错误的方式。左上角的坐标系为 0,0,当您向下或向右移动时正增加,那么向西移动通常意味着向左移动,这意味着 X 的值减小,而向东则相反。你正在做相反的事情。

于 2009-08-19T11:02:38.997 回答