我在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)添加到位置矢量中来执行运动,然后将玩家的边界矩形_bounds更新到该新位置。
此后,将检查玩家的新边界Rectangle是否与游戏“地图”中每个图块的相交,如果检测到相交,则玩家无法朝该方向移动,因此将其位置设置为先前的位置_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)。
编辑:您的代码不起作用,因为您设置了oldPos = pos而不实例化一个新的Vector2。这意味着当您添加到pos时,它也会更改oldPos。假设oldPos = new Vector2(pos);
关于java - libGDX-奇怪的碰撞行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36227205/