我正在创建一个赛车游戏,其中我遇到了一些问题,而创造人工智能。我需要做的是让人工智能从一个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,那么我的人工智能就更接近右转,现在我只能让它一直向右或向左转。
发布于 2014-11-29 19:16:40
这就是选择方向所需的内容(这是一个硬编码值的示例):
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-29 19:09:44
我想,在某个地方,你可以计算出实际角度和下一个角度之间的差异,比如turn = newDirection - actualDirection。
做10 - 350 = -340告诉你AI需要转向-340°。
然而,(10 - 350 + 360) % 360 = 20告诉你的人工智能,它需要转向+20°。增加360是为了确保你的角度是正数,所以模块将像预期的那样工作(因为-340 % 360 = -340)。
你真正想要的是,永远不要超过180度。因此,在减少0到360之前再添加180,然后删除它们,这将使您的结果在-180,180同时停留模块360°(因此相同的角度):
turn = (newDirection - actualDirection + 540) % 360 - 180
如果你不想一次完成这个回合,那么你就可以在这个回合中分手,比如一次5度,就像你似乎已经在做的那样。
发布于 2014-11-29 19:03:23
你可以使用(0;360)范围以外的学位,所以你可以。从360到365,它就像预期的那样工作。如果你以后想,比方说,比较两个角度,只需说角度% 360
https://stackoverflow.com/questions/27205801
复制相似问题