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

Libgdx近战攻击碰撞检测

莫兴言
2023-03-14

我有一个带有3D模型实例的3D场景;我想做冲突检测。我目前正在遵循本教程(http://blog.xoppa.com/using-the-libgdx-3d-physics-bullet-wrapper-part1/)。然而,我想要的有点复杂。

有一个角色(一个knight.g3db模型,是Libgdx基本3d模型类的示例代码的一部分),它可以用剑攻击。我还有另一个模型实例,我想用剑“攻击”它。

检查两个碰撞对象是否没有问题,因为可以很容易地从Bullet库中检测到。我想要的可能是以下内容,但我不确定如何实现:

    < li >将剑作为碰撞对象,或者 < li >检查是否只有骑士“箱子”的前部与其他物体碰撞,或者 < li >在骑士角色前面创建一个单独的隐形虚拟框,并在发生碰撞时以此为基础。

你知道有什么参考资料可以做到这一点吗(如果上面提出的解决方案是可能的)?或者如果有更好的解决方案,请告诉我。

我试图避免的是:骑士攻击,而另一个物体在后面,仍然被击中。

提前感谢。

共有2个答案

司空均
2023-03-14

这些是我用来检查敌人物体是否在英雄的‘视野’内的(工作代码):

/**
 *
 * @param localAngle - the current yaw of the Player
 * @param angleTarget - the angle between the player and the target receipent of the attack -- use RotationHelper.angle() method
 * @param offset - the difference in localAngle(hero) and angleTarget(enemy)
 * @return
 */
public static float angleDifference(float localAngle, float angleTarget, int offset) {
    float newLocalAngle = (convert180to360(localAngle) + offset) % 360;
    AppLog.log("ANGLE_DIFFERENCE2", "localAngle(yaw, degrees, with offset): " + newLocalAngle + ", angleTarget: " + angleTarget);

    float result = 180 - Math.abs(Math.abs(newLocalAngle - angleTarget) - 180);
    AppLog.log("ANGLE_DIFFERENCE2", "result : " + result);
    AppLog.log("ANGLE_DIFFERENCE2", "==================================");
    return result;
}

public static float angle(Vector3 vectorA, Vector3 vectorB) {
    return new Vector2(vectorB.x - vectorA.x, (-vectorB.z) - (-vectorA.z)).angle();
}


public static float convert180to360(float originalAngle) {
    float newAngle = 0;
    if(originalAngle < 0) {
        newAngle = (originalAngle + 180) + 180;
    } else {
        newAngle = originalAngle;
    }

    return newAngle;
}

感谢@Menno Gouw从Vector3获得角度的想法。

下面的代码是我如何使用这些助手方法的:

                float angleTarget = RotationHelper.angle(hero.transform.getTranslation(hero.tmpVector), enemy.transform.getTranslation(enemy.tmpVector));
                    float angleDifference = RotationHelper.angleDifference(hero.transform.getRotation(playerObject.tmpRotation).nor().getYaw(), angleTarget, CHARACTER_TO_WORLD_ROTATION_OFFSET);
                    AppLog.log("ANGLE_DIFFERENCE2", " angle from point hero to enemy): " + angleTarget);

                    if(angleDifference < VIEW_ANGLE_THRESHOLD) { //use 'angleDifference < VIEW_ANGLE_THRESHOLD'

                        enemy.hurt(hero.stats.damage);
                        AppLog.log("HERO_STATE", "Enemy monkey hit!");
                    }

                    if(enemy.stats.hp <= 0) {
                        AppLog.log("ENEMY_STATE", "Dead monkey");
                        //TODO: Remove monkey from game 
                        enemy.die();
                        instances.removeValue(gameObject, true);
                    }

希望这可以帮助您,如果您遇到相同的问题。如果对此有改进或问题,请随时进行更改。

瞿子濯
2023-03-14

如果你只是想避免背部的敌人被击中,你可以检查你是否面对他们。我想你有一个移动方向向量,检查该向量与根据你的位置和敌人计算的向量的旋转差异。

类似这样的事情(免责声明:出于我的想法,不确定这是否有效,只是给你一个想法):

float yourAngle = direction.angle();
float enemyAngle = new Vector2(enemyPos.x - playerPos.X, enemyPos.y - playerPos.y).angle();

if (yourAngle - enemyAngle < 30 && yourAngle - enemyAngle > -30) //enemy within a 60 degree cone in front of you.

这可能不是一个理想的解决方案,但它确实是一个廉价的解决方案并且可能非常有效。

 类似资料:
  • 我的问题主要与它背后的理论有关。我为一个项目制作了一个2D游戏,通过使用Rectangle类中的.overlapps方法检测碰撞,碰撞处理得很好。首先,被认为是连续或离散碰撞技术。当我读到这个理论时,我说它是离散的,但我在网上的文章中读到离散的主要缺点是它在实际发生碰撞后检测到碰撞。所以,我的问题是:它实际上是离散的吗?如果是这样的话,我看不出它有什么缺点吗?谢谢

  • 我试图让我的游戏中的碰撞完全完美。我测试的是,如果你和玩家撞墙,你就会停下来。我只实现了当玩家撞墙左侧时(当墙在玩家右侧时)的碰撞代码。这是代码。 注意:如果我走得很慢,它会在我想要停止的地方停止玩家,但是走得很快,它不会按照我想要的方式进行碰撞 本质上,代码指出如果墙在右边,它将检查玩家矩形的右下角,减去墙的左下角,并检查两者之间的距离是否0.001. 0.001几乎是一个不明显的距离,因此我使

  • 我正在做一个2d平板游戏。到目前为止,我已经做了一些事情。我正在使用libgdx的矩形进行基本的碰撞检测,所以考虑到我现在只有草块,我用Java制作了一个单块世界(文件读取器还没有准备好),问题是我的检测只在第一次工作,换句话说,如果我产生碰撞到一个块,它会检测到碰撞并这样做。虽然如果我在没有碰撞的情况下,让我的球员在方块顶部出现,球员将永远摔倒。 这是代码=

  • 使用< code >加速计,我的精灵图像会左右移动,如果我触摸屏幕,精灵会移动到Y轴。我想在不同的精灵之间进行碰撞检测,这样如果精灵穿过一个物体,它就会停下来藏在那个物体里。我已经看了这个https://www.youtube.com/watch?v=T1aN-vTqLc的教程,但什么也没发生。进行碰撞检测的正确方法是什么?我不知道我的编码有什么问题。任何建议或更好的教程谢谢和进步 这是我的编码

  • 我花了数小时寻找解决方案:我正在用libgdx开发一个自上而下的小游戏(可能这与我使用的引擎有关)。现在我必须在我的角色(圆形)和墙(矩形)之间实现碰撞检测。如果可以滑动,我希望角色在碰撞时沿着墙滑动。让我解释一下: 如果我向上移动45度,我可能会撞到墙的下面、左边或角落。 如果我与左边相撞,我想停止x运动,只向上移动。如果我离开墙壁,那么我想继续向上移动。与下侧相同(停止y运动) 如果我与角落相

  • 我一直在尝试在Libgdx中找到/创建矩形的碰撞检测,但似乎什么都做不到。我有一个叫bucket的矩形,宽度和高度为64,还有一个叫wall的矩形,宽度和高度为64。我试着让玩家不穿过矩形,可以在粘墙的同时继续移动,而不需要通过相位或随机传送。我的方法在有1个块的情况下有效,但当有多个块的时候,它就会中断,不起作用。 我知道这种方法很难看但这只是实验 如果有人能给我指出正确的方向或分享一些对我有帮