我目前正在制作一款游戏,其中该游戏驾驶半卡车,并且通过尝试砰击来跟随并被敌方车辆攻击。我从一位老师那里得到了一些关于如何让敌人选择去哪个方向以便跟随并攻击玩家的帮助。在实施她给我的东西后,我得到了奇怪的行为,觉得我错过了什么。
当我在玩家附近的游戏中放置一辆敌人的汽车并将玩家的位置传递给该功能时,敌人的汽车只是旋转成圈。如果我为它添加速度,我会以大圆圈开车。一般来说,它永远不会选择直接驾驶的方向。
调试后,似乎我的if语句没有解决,每次更新时它都会一直试图回到0,但由于某种原因,它不能。 我不确定玩家的坐标是否正在创建问题,或者我的数学计算是否有问题。
void EnemySpeedy::playerTracking(float posX, float posY)
{
//Direction choosing
dir.x = posX - pos.x;
dir.y = posY - pos.y;
//plus maybe this?
goalAngle = atan2f(dir.y, dir.x);
//I think this is the problem code?//
if (angle < goalAngle) angle -= sfw::getDeltaTime() * angularSpeed;
else angle += sfw::getDeltaTime() * angularSpeed;
//AI Movement alla adding velocity
acc = speed;
vel = vel + (acc - dragVel) * sfw::getDeltaTime();
vel = std::fmaxf(0, vel);
vel = std::fminf(vel, maxVel);
pos = { pos.x + vel * cosf(angle * PI / 180) * sfw::getDeltaTime(),
pos.y + vel * sinf(angle * PI / 180) * sfw::getDeltaTime() };
}
答案 0 :(得分:3)
atan2f
会返回弧度,因此goalAngle
位于[-Pi,Pi]范围内。
我不知道您的angle
和angularSpeed
是否使用相同的指标,但是当您计算sinf
和cosf
时,您正在转换{{ 1}}从度到弧度。
我建议将所有角度保持在弧度并检查它们:
angle
然后,你可以试试这个逻辑:
#include <cmath>
inline float normAngle ( float ang ) {
return ang < -M_PI ? ang + 2.0*M_PI : ( ang > M_PI ? ang - 2.0*M_PI : ang);
}
inline float limitValue ( float x, float min, float max ) {
return x < min ? min : ( x > max ? max : x );
}