java - 在 libgdx java 中向左移动时碰撞失败

标签 java libgdx

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

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

Example

这是我的球员坠落更新

    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 格宽。

非常感谢任何帮助!

最佳答案

如果你用幅度距离改变你的条件,你应该能够检查左边或右边:

代替:

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 设置一个 setter 来偏移几个像素:

    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]

有两次吗?

关于java - 在 libgdx java 中向左移动时碰撞失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32572809/

相关文章:

java比较对象: using reflection?

java - 为什么java中1200/1080 = 1?

ios - LibGDX RoboVM Robopods Facebook 登录错误

java - 如何从矩形数组中删除随机矩形?

java - 使用 Stax 解析器时如何定义 *start* 和 *end* 标记?

java - Spring 数据 Neo4J 4.0.0 : BeforeSaveEvent not firing?

java - 安卓 LibGDX : Cannot Load Image Dependancies

java - 调整舞台和相机的大小

java - NOTIFICATION_RECEIVER 无法解析为变量

java - 从void返回字符串