【发布时间】:2015-09-03 04:59:00
【问题描述】:
我使用 2d 布尔数组来处理 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();
}
我已经找了好几个小时,但我似乎无法将球员带到我想要的地方。在这里仅供参考,我希望玩家在他的小跌落或任何速度的跌落之后看起来像。
非常感谢任何帮助。我只需要我的碰撞非常准确,而不是准确。谢谢!!
【问题讨论】:
-
我不确定 libgdx 但这确实不应该发生。您是否在检查碰撞之前更新了玩家的位置?
-
@ChiefTwoPencils 如果您查看第二段代码,您会发现我确实首先更新了碰撞,然后是播放器。感谢您的评论!
-
我想知道你是否真的把它移动得很慢,因为如果你移动它很快,这是一个常见的问题,因为你只更新最大。每秒 60 次。因此,如果它移动得很快,它可能会“超出边缘”,因为你注意到它很晚。对此的解决方案是将更新外包给具有更高更新率的其他线程。 (例如,每个奈奎斯特定理 120 fps)
-
这看起来太简单了,无法处理与此问题的冲突或需要另一个线程。您应该更新播放器,根据播放器的新位置检查碰撞,解决它,然后渲染它。原因是如果你推动了一个方向,玩家在更新和渲染之前不会移动;然后你看到了。但是,如果您在更新之前检查碰撞,那么您将错过第一次解决碰撞并将玩家渲染到另一个对象中的机会。无论如何,根据我的经验。
-
@BennX 我可以向你保证,它的移动速度非常慢,向下的速度为 0.0081,从上方一个街区到达该点需要 7 秒