我使用二维 boolean 数组来处理 java libgdx 中真实点之间的碰撞。我的碰撞检查并查看玩家是否可以或不能向左或向右移动、跌倒或跳跃。这一切都有效,但是碰撞速度不够快,无法检测到玩家何时应该停止跌倒。当玩家停下来时,他已经进入平台的 1/5 了。
这是一张图片,可以更好地描述我的意思。玩家为粉红色,可碰撞平台为红色。下图是玩家刚刚从一个小水滴降落到平台上,重力非常非常慢。
我的碰撞类非常简单,如果当前位置已经正确,则不允许移动,这里的类仅供引用。请注意,该类功能齐全,只是速度较慢。
@Override
public void run() {
if(mapGrid.getGrid()[(int) (entity.getGridPosition().x + 1)][(int) entity.getGridPosition().y + 1]){
entity.setCanMoveRight(false);
}else
entity.setCanMoveRight(true);
if(mapGrid.getGrid()[(int) (entity.getGridPosition().x - 1)][(int) entity.getGridPosition().y + 1]){
entity.setCanMoveLeft(false);
}else
entity.setCanMoveLeft(true);
if(mapGrid.getGrid()[(int) (entity.getGridPosition().x)][(int) entity.getGridPosition().y] ||
(mapGrid.getGrid()[(int) (entity.getGridPosition().x + 1)][(int) entity.getGridPosition().y] &&
!mapGrid.getGrid()[(int) (entity.getGridPosition().x)][(int) entity.getGridPosition().y])){
entity.setCanFall(false);
}else
entity.setCanFall(true);
}
这里是所有内容正在更新的地方。
@Override
public void render () {
collisionHandler.run();
player.update();
mapGrid.update();
tmpLogger.log();
camera.position.set(player.getPosition(), 0);
camera.translate(player.getPosition());
camera.update();
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
tmpRend.begin();
mapGrid.render(tmpRend);
player.render(tmpRend);
tmpRend.end();
}
我已经寻找了好几个小时,但我似乎无法将玩家带到我想要的地方。这里仅供引用,我希望玩家在小幅下降或任何速度下降后看起来像这样。
非常感谢任何帮助。我只需要我的碰撞非常准确,而不是有点准确。谢谢!!
最佳答案
据我了解,仅仅在碰撞后停止化身是不够的;在现实生活中,稍慢的帧可以将您的化身嵌入到表面中(正如您所经历的那样) - 您需要检测碰撞点,然后仅将化身移动那么远,以便它正好位于碰撞点上。
另一种说法是,当您检测到与地面发生碰撞时,您需要将头像向后移动,使其刚好位于地面上方。
关于java - java中的碰撞在基于网格的碰撞系统中检测得不够快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32367284/