C.O*_*D.E 9 java maze collision-detection collision libgdx
我已经在这里工作了2-3个星期,我仍然无法进行适当的碰撞检测.我用矩形创建了一个迷宫.我希望我的对象(在矩形中)在我的对象与任何墙碰撞并且能够移动到任何地方(或向下滑动墙)时停止.我的墙(矩形)具有负坐标,如下所示:
shapeRenderer.rect(0.9f, 12, 1.15f, 0, Color.RED, Color.RED, Color.RED, Color.RED); //NORTH
shapeRenderer.rect(1, 12, 0, -1.05f, Color.RED, Color.RED, Color.RED, Color.RED); // WEST
shapeRenderer.rect(2, 12, 0, -1.05f, Color.RED, Color.RED, Color.RED, Color.RED); // EAST
shapeRenderer.rect(0.9f, 11, 1.15f, 0, Color.RED, Color.RED, Color.RED, Color.RED); // SOUTH
Run Code Online (Sandbox Code Playgroud)
我目前正在使用我在SO中找到的重叠方法.这是我的CollisionManager类中的方法:
private boolean overlaps (Rectangle collision, Rectangle wall) {
return Math.min(collision.x, collision.x + collision.width)
< Math.max(wall.x, wall.x + wall.width)
&& Math.max(collision.x, collision.x + collision.width)
> Math.min(wall.x, wall.x + wall.width)
&& Math.min(collision.y, collision.y + collision.height)
< Math.max(wall.y, wall.y + wall.height)
&& Math.max(collision.y, collision.y + collision.height)
> Math.min(wall.y, wall.y + wall.height);
}
Run Code Online (Sandbox Code Playgroud)
我有一个函数可以保存对象所做的所有位置移动.因此,当发生碰撞时,对象恢复到最后一次移动之前的前一次移动(因为最后一次移动是发生碰撞时)(下面的示例):
private void overlapsTop(Entity object, Rectangle wall){
Rectangle r = new Rectangle();
if(spritePositions.size() != 0){
r = spritePositions.get(spritePositions.size()-1);
}
object.update(r.x, r.y, r.width, r.height);
object.getObject().setBounds(r.x, r.y, r.width, r.height);
spritePositions.clear();
}
Run Code Online (Sandbox Code Playgroud)
附加信息:我正在移动我的对象:
public void moveRight(){
position.x += 1f;
update();
}
public void update(){
boundingRectangle.set(position.x, position.y, object.getWidth(), object.getHeight());
}
Run Code Online (Sandbox Code Playgroud)
我被困的地方是我的重叠功能(我在SO中找到的那个).它适用于大多数情况; 但是,例如,如果对象在右边的墙壁附近移动并触摸它,则该函数返回true并执行所有操作.但是让我们说如果我沿着墙壁滑动并直接向下移动并且没有墙壁,则物体在某一点停止,因为它检测到物体底部与墙壁顶部之间的碰撞(当没有墙壁时)和物体右侧与墙壁左侧之间的碰撞.
我正试图为此找到另一种解决方案.我只是希望我的物体停在任何墙壁上并能够移动(或滑下墙壁)而不怀疑在附近没有墙壁的地方可能发生碰撞.我觉得我非常接近解决方案,但我需要一些额外的帮助.
UPDATE
我已经更新了moveRight函数和更新函数.@Adrian Shum和@Matthew Mark Miller我现在用一个整数(意思是代替0.01f,我使用1f)制作了所有东西.
因此,我用来移动对象的以下代码是这样的:
if(Gdx.input.isKeyPressed(Keys.RIGHT)){
if(collisionManager.canSpriteNotMoveRight(object)){
object.stopGoingRight();
}else{
object.moveRight();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的collisionManager类中,函数stopGoingRight如下:
public void stopGoingRight(){
position.x -= 1f;
update();
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.当物体与墙壁碰撞时,物体会停止并反弹.非常好.但我有另一个问题(这很令人恼火),我会尽力描述最好的问题.例如,如果我继续将物体移动到墙上,物体将从该墙反弹多次; 如果我停止按下向上键,物体有时会卡在墙内.因此,当我按下向下键时,它会上升而不是下降(或者如果我向左按下,对象将向右而不是向左),因为重叠功能被执行(因为对象和墙都是相交).
我有办法解决这个问题吗?似乎Libgdx并不是非常适合处理这种碰撞检测,但我现在正在深入构建我的游戏.
你的碰撞算法看起来很冗长但是正确(Wordy因为x的最小值,x +宽度总是只有x,因为宽度必须> = 0,而最大值的倒数为真).
您是否考虑过它是浮点精度问题的可能性?例如,如果您将1添加到fp编号,然后从结果中删除1,则无法保证返回原始值.您可能会稍微或多或少,因为中间结果可能无法表示为浮点数.
我最喜欢的例子:.1f + .2f> .3f
我终于找到了一个很好的解决方案,这要归功于以下链接:On重叠,玩家陷入 libgdx 矩形。
基本上我必须创建一个“假”移动来查看对象是否会与墙壁碰撞。如果发生碰撞,我只是停止物体而不执行新的移动。
感谢大家的帮助:)!! 非常感谢!
| 归档时间: |
|
| 查看次数: |
3337 次 |
| 最近记录: |