有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的libgdx冲突在基于网格的冲突系统中检测速度不够快

我在Javalibgdx中使用一个2d布尔数组来处理真实点之间的冲突。我的碰撞检查,看看玩家是否能左右移动,摔倒或跳跃。这一切都是可行的,但碰撞速度不够快,无法检测到玩家何时应该停止坠落。当玩家停下来的时候,他已经差不多是平台内部的1/5了

这里有一张图片可以更好地描述我的意思。玩家是粉红色的,可碰撞平台是红色的。下图是一名玩家从一个很小的落点降落到平台上,重力非常缓慢

Player collision

我的碰撞类非常简单,如果当前位置已为真,则不允许移动,这里的类仅供参考。注意,这个类功能齐全,只是速度慢

    @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();
}

我已经找了好几个小时了,但我似乎找不到我想要的球员。仅供参考,这里是我希望球员在他的小下降,或任何速度下降后的样子。 enter image description here

非常感谢您的帮助。我只需要我的碰撞非常精确,不是那种精确。谢谢


共 (1) 个答案

  1. # 1 楼答案

    据我所知,仅仅在碰撞后停止阿凡达是不够的;在现实生活中,一个稍微慢一点的帧可以将你的化身嵌入到表面中(正如你正在经历的那样)-你需要检测碰撞点,然后将化身移动那么远,使其正好位于碰撞点上

    另一种说法是,当你检测到与地面的碰撞时,你需要将化身向上移动,使其刚好位于地面之上