libGDX - 奇怪的碰撞行为

libGDX - Strange Collision Behaviour

我在 libGDX 中实现非常基本的碰撞时遇到了一些困难。 "player"的更新代码如下:

private void updatePosition(float _dt)
{
    Vector2 _oldPos = _pos;

    _pos.add(_mov.scl(_dt*50));
    _bounds.setPosition(_pos.x-8, _pos.y-12);

    if(_game.getMap().checkCollision(_bounds))
    {
        System.out.println("Collision Detected");
        _pos = _oldPos;
        _bounds.setPosition(_pos.x-8, _pos.y-12);
    }
}

因此,最初 _oldPos 在应用任何移动之前存储为 _pos 位置向量的值。

然后通过将移动向量 _mov(乘以增量时间 * 50)添加到位置向量来执行移动,玩家的边界矩形 _bounds 然后更新到这个新位置。

在此之后,将检查玩家的新边界矩形是否与游戏 "map" 中的每个图块相交,如果检测到交点,则玩家无法朝该方向移动,因此他们的位置设置以前的位置 _oldPos 并且边界矩形的位置也设置为以前的位置。

不幸的是,这不起作用,玩家可以直接穿过方块,如下图所示:

那么这里发生了什么?我认为这段代码应该解决检测到的碰撞是否正确?

奇怪的是,替换

_pos = _oldPos;

with(做同样的动作只是相反)

_pos.sub(_mov.scl(_dt*50));

产生非常不同的结果,玩家仍然可以穿过固体块,但遇到阻力。

这很令人困惑,因为以下陈述应该是正确的:

_oldPos == _pos.sub(_mov.scl(_dt*50));

尝试在移动前测试未来位置。如有碰撞请勿移动

更好的碰撞检测解决方案是使用 Vector2 速度,并且每一帧都将速度添加到位置。您可以使用一种方法来测试是否按下向上箭头键,将速度加 1(或您想要的任何速度)。如果按下,则减去 1(或任何速度)。然后你可以在播放器上有 4 个碰撞矩形,1 个在播放器顶部、底部、左侧和右侧。你可以说 if(top collides with bounds){ if(velocity.y > 0){ set velocity.y = 0. } }

并且对下、左和右执行相同的操作(例如...对于底部,确保测试 if(velocity.y < 0) 而不是 if(velocity.y > 0)。

编辑: 您的代码无法正常工作,因为您设置了 oldPos = pos 而没有实例化一个新的 Vector2。这意味着当您添加到 pos 时,它也会更改 oldPos。所以说 oldPos = new Vector2(pos);