奇怪的碰撞行为

我在libGDX中实现非常基本的碰撞有一些困难。 “玩家”的更新代码如下:

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)与位置矢量相加来执行运动,然后将运动员的边界矩形_边界更新为这个新位置。

在此之后,检测玩家的新边界矩形与游戏“地图”中的每个瓦片的交集,如果检测到交集,则玩家不能在该方向上移动,因此他们的位置被设置为前一个位置_oldPos和边界矩形位置也设置为前一个位置。

不幸的是,这不起作用,玩家可以直接穿过瓷砖,如图所示: 图片

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

奇怪的是,更换

_pos = _oldPos;

与(使同样的举动倒过来)

_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);


尝试在移动之前测试未来的位置。 如果碰撞,请勿移动。

链接地址: http://www.djcxy.com/p/66571.html

上一篇: Strange Collision Behaviour

下一篇: Joining shapes together and tracing their outline