奇怪的碰撞行为
我在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