libGDX - 奇怪的碰撞行为

时间:2016-03-25 20:06:24

标签: java android libgdx collision-detection

我在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 (乘以delta-time * 50)添加到位置矢量来执行运动,然后更新玩家的边界矩形 _bounds 到这个新职位。

在此之后,将检查玩家的新边界矩形与游戏“地图”中每个图块的交叉点,如果检测到交叉点,则玩家无法向该方向移动,因此他们的位置设置为之前的位置 _oldPos ,边界矩形的位置也设置为上一个位置。

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

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

奇怪的是,取代

_pos = _oldPos;

with(反向做同样的动作)

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

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

这非常令人困惑,因为以下陈述应该是真的:

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

2 个答案:

答案 0 :(得分:1)

更好的碰撞检测解决方案是使用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);

答案 1 :(得分:0)

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