当前位置: 首页 > 知识库问答 >
问题:

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

施华奥
2023-03-14

我在我的游戏中使用了基于网格的碰撞检测,除了一件事外,其他一切都在运行,当玩家在瓷砖上向左移动时,他从瓷砖中跌落。之所以会发生这种情况,是因为当向左然后向右移动时,网格点更新得更快,因为玩家的网格位置基于坐标移动。例如:如果玩家在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());

向量3的z方向是这样的,当它返回p时,它不会得到“UpdateMoverRight”的信息

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

任何帮助都非常感谢!

共有2个答案

景鸿晖
2023-03-14

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

司空镜
2023-03-14

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

而不是:

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更改为更大。

如果在中输入一个较大的值,则在检测到实体后,始终可以将其移动到正确的位置,这样就不会因设置位置而偏移几个像素,如下所示:

    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]

进去两次?

 类似资料:
  • 有人对如何处理Unity中缺少碰撞的快速移动物体有任何建议吗?我正在为移动设备创建一个突破游戏,发现当桨移动得非常快时,它会错过与球的碰撞。我将碰撞更改为连续检测,但这会引发奇怪的行为,例如碰撞时桨被推倒。 我还尝试使用dontgothrough脚本使其适用于2D碰撞器,但没有成功。有人有什么建议吗?

  • 如果我想每秒移动一个物体40像素,并且我有以下场景,我如何有效地检测到发生了碰撞? 假设两个对象都是 10 x 10 个正方形 2秒时移动物体的起点: 40, 100 移动物体在3秒时的终点: 80, 100 停滞物体在60,100 如果我只移动移动物体一次(从40到80之间没有任何移动),我怎么知道它们之间有一个物体? 这显然是我正在做的事情的简化版本,但我希望它易于理解。 我唯一能想到的是检查

  • 我有一个玩家类,是一个马里奥角色。当我向左走时,我调用一个方法来启动左动画并设置速度。 现在我的问题是:如何为玩家制作碰撞矩形?这是我的矩形:

  • 为了计算x和y速度,我求解了一个动量守恒和动能守恒方程组。 顺便说一下,这些方程没有考虑圆的“形状”。 所以我通过求两个圆相交的切线来计算回弹角。 现在我有两个不同的最终速度方向:一个是用动量定律计算的,一个是用回弹计算的。 我不知道怎么把两种速度结合起来才能得到最后一种

  • 有人能帮我在我的精灵中添加碰撞点吗?我过去有一个代码,我在图像上分层位图,但是同样的代码不能很好地集成到物理画线上,而不是检测图像上的黑/灰位置。 如果有人能帮助我或为我指出正确的方向,我会很高兴。

  • 我有这个骑士角色,有一把剑和一个攻击动画。我想检查剑是否与敌人相撞,然后降低敌人的生命值。我设法做到了这一点,但每次sowrd的对撞机击中敌人的对撞机时,我都有互动。显然我不想那样,但互动应该只在玩家进攻时发生。我尝试了不同的approahces: 通过在字符脚本中执行此操作,使用布尔值检查攻击 这是敌人的剧本 使用而不是 到目前为止似乎没有什么工作,我知道我错过了一些愚蠢的东西,当你们告诉我,请