2

我正在创建一个赛车游戏,在创建 AI 时遇到了一些问题。我需要做的是让 AI 从 X,Y 位置到另一个 X,Y 位置的“检查点”。通过在将要前往的地图周围放置不同的不可见检查点来创建 AI 行驶轨迹。

我可以通过计算我到检查点的 X、Y 差来获得到检查点的方向,然后使用 tan(Deg) = Y/X,女巫给了我必须从当前位置开始的方向。

distanceToMoveX = checkpoint1X - this.getX();
distanceToMoveY = checkpoint1Y - this.getY();
newDirection = ((double)distanceToMoveY / distanceToMoveX) * 100;

所以现在我有了从当前位置出发的方向,也有了当前移动的方向。如果我现在的方向是 350 并且我想去 10,我现在想做的是让我的 AI 意识到它更接近右转。因为现在我只能让它一直右转或左转。

4

3 回答 3

1

好吧,我猜你在某个地方计算了实际角度和下一个角度之间的差异,比如turn = newDirection - actualDirection.

Doing10 - 350 = -340告诉你 AI 它需要转动 -340°。

但是,(10 - 350 + 360) % 360 = 20告诉您的 AI 它需要转 +20°。添加 360 是为了确保您的角度为正,因此模数将按预期工作(因为 -340 % 360 = -340)。

你真正想要的,永远不要超过 180°。因此,在 0 到 360 之间减少之前再添加 180,然后删除它们,这将在 [-180,180] 中移动结果,同时保持模块 360°(因此角度相同):

turn = (newDirection - actualDirection + 540) % 360 - 180

然后,如果您不希望它一次完成,那么您可以根据需要拆分这个转弯,例如一次 5 度,就像您似乎已经在做的那样。

于 2014-11-29T19:09:44.773 回答
0

您可以使用 (0;360) 范围之外的度数,因此您可以从 360 到 365 并且它按预期工作。如果你以后想,比如说,比较两个角度,就说 angle % 360

于 2014-11-29T19:03:23.657 回答
0

这是您选择方向所需要的(这是一个带有硬编码值的示例):

private int correctedDirectionCalculation(int calculation){
   return calculation >= 0 ? calculation : calculation + 360;
}

public void chooseDirection() {
    int targetDirection = 5;
    int currentDirection = 360;

    int goingRightDistance = correctedDirectionCalculation(targetDirection - currentDirection);
    int goingLeftDistance = correctedDirectionCalculation(currentDirection - targetDirection);

    System.out.println(goingLeftDistance < goingRightDistance ? "Go Left!" : "Go Right!");
}

至于渲染时Y轴上的反转值,我想您只需反转Y值即可修复它(乘以-1)。

于 2014-11-29T19:16:40.433 回答