【问题标题】:Collision failing while moving left in libgdx java在libgdx java中向左移动时碰撞失败
【发布时间】:2015-09-14 19:52:26
【问题描述】:

我在我的游戏中使用了基于网格的碰撞检测,除了一件事之外,一切都正常工作,当玩家在瓷砖上并向左移动时,他从瓷砖上掉了下来。发生这种情况是因为当玩家向左然后向右移动时,网格点的更新速度更快,因为玩家的网格位置会根据坐标发生变化。例如:如果玩家是 100,他不会更新,直到他达到 150,单元格范围是 100 - 150(单元格大小为 50),但如果你向左移动,你将是 99,它包含在 50 - 100 个细胞区域。这是一张真正有助于更好地解释的图片

注意:红色代表玩家网格位置,粉色矩形是播放玩家动画的位置,所以粉色应该不能穿过瓷砖。

这是我的玩家在坠落时的更新

    public void checkFall(Vector3 positionToCheck) {
    if (positionToCheck != null) {

        if (this.position.y <= positionToCheck.y + MapGrid.CELL_SIZE && positionToCheck.z == -1)
            canFall = false;


    }else
            canFall = true;
}

这是坠落的碰撞检测

    public Vector3 updateFall() {

    /* ================================== */
    /* ====*Exclusively for falling*===== */
    /* ================================== */
    if (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
            (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
                    entity.getPosition().x + 1 >= entity.getGridPosition().x)) {
        p.x = (int) ((entity.getGridPosition().x) * MapGrid.CELL_SIZE);
        p.y = (int) ((entity.getGridPosition().y) * MapGrid.CELL_SIZE);
        p.z = -1;
        return p;
    }



    return null;

}

这是它如何检查以防你好奇

    player.checkFall(collisionHandler.updateFall());

vector3 的 z 方面是这样的,当它返回 p 时,它不会得到让我们说“updateMoveRight”的信息

我尝试检查右侧是否为真,而实际位置为假,但除非你挖了 2 个点,否则你不能跌倒,这不是我想要的。我希望玩家能够紧密贴合(1 格宽)游戏中的所有内容都是 1 格宽。

非常感谢任何帮助!

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    如果您使用幅度距离更改条件,您应该能够检查左侧或右侧:

    代替:

    if (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
            (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
                    entity.getPosition().x + 1 >= entity.getGridPosition().x)) {
    

    改为:

    if (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
            (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
                    Math.abs(entity.getGridPosition().x - entity.getPosition().x) < 1 ) {
    

    如果您的对象每帧移动超过 2 个像素,您可以将数字 1 更改为更大。

    如果您输入一个较大的值,您可以在检测到实体后始终将其移动到正确的位置,这样它就不会通过像这样为 Position 设置设置器来偏移几个像素:

        if (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
            (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y] &&
                    Math.abs(entity.getGridPosition().x - entity.getPosition().x) < 10 ) {
            entity.setPositionX(entity.getGridPosition().x);
    

    还有为什么:

    (mapGrid.getGrid()[(int) entity.getGridPosition().x][(int) entity.getGridPosition().y]
    

    在那里两次?

    【讨论】:

      【解决方案2】:

      您在逻辑上描述的是,只有当粉红色矩形的两侧都在作为孔的网格位置上方时,您才会跌倒。因此,您必须在 updateFall() 方法中检查两个单独的网格位置,而不仅仅是一个。

      【讨论】:

      • 但是红色方块本身是一个网格位置,它不会比那些矩形的大小更小
      • 不明白你在说什么——忽略红色矩形。只需检查粉红色矩形的左右是否超出空白区域即可。
      • 那是违反格子碰撞系统的,玩家自己只有一格,没有他的右边。如果他是两块瓷砖,这个问题早就解决了。
      • 如果你不检查两个不同的网格位置,你想要的逻辑是不可能实现的。如果用户在视觉上看到粉红色的矩形,这就是您需要确定要检查的第二个网格位置应该在左侧还是右侧。
      • 这应该不是不可能的,如果网格位置在左边,右边有东西不允许下落
      猜你喜欢
      • 2017-05-09
      • 2013-05-19
      • 2018-09-03
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多