在游戏中实现漫游行为

Implementing Wander behavior in a game

本文关键字:游行 漫游 实现 游戏      更新时间:2023-10-16

我正在做一些游戏,现在我正在尝试为我的坦克实现漫游行为,但我无法成功实现它。

问题是它计算它的位置,如果它像 (430,130) 并使用rand_floatRange函数它给自己一些介于 0 和屏幕高度 (500) 之间的值,比如说 320,它离开屏幕。

我的调试过程中根本没有错误。它建造得很好,坦克在场地上移动,但它们在一段时间后离开屏幕,因为没有限制可以阻止它们达到高值(例如:坦克位置为 (450,100),屏幕为 (600,600),如果坦克获得新目标( 它将从那个地方达到 ( 300,200 ) (它需要从 0 到 600 的值), 它将是(750,300),它将离开屏幕。

还有其他东西,所以我可以修复它以正常工作,并且在屏幕高度和屏幕宽度范围内。

void Tank::Wander()
{
    float randXs,randZs;
    srand(time(NULL));
    for(int i=0;i<tanks.size();i++)
    {
        randXs = rand_FloatRange(screenHeight);
        randZs = rand_FloatRange(screenHeight);
        {
            if(randXs < tanks[i]->givePosX() && randZs < tanks[i]->givePosZ() )
            {
                tanks[i]->posX= tanks[i]->givePosX() - 0.1;
                tanks[i]->posZ= tanks[i]->givePosZ() - 0.1;
            }
            else if(randXs > tanks[i]->givePosX() && randZs < tanks[i]->givePosZ() )
            {
                tanks[i]->posX= tanks[i]->givePosX() +0.1;
                tanks[i]->posZ= tanks[i]->givePosZ() - 0.1;
            }
            else if(randXs > tanks[i]->givePosX() && randZs > tanks[i]->givePosZ() )
            {
                tanks[i]->posX= tanks[i]->givePosX() + 0.1;
                tanks[i]->posZ= tanks[i]->givePosZ() +0.1;
            }
            else 
            {
                tanks[i]->posX= tanks[i]->givePosX() - 0.1;
                tanks[i]->posZ= tanks[i]->givePosZ() + 0.1;
            }
        }
    }
}  
float Tank::rand_FloatRange(float a)
{
    float c;
    c = rand() % (int) a;
    return c;
}

如果还有其他需要,如果我有,我会在这里提供。

我的C++不是太好,但我在你的逻辑中看到了问题。

randXs = rand_FloatRange(screenHeight);
randZs = rand_FloatRange(screenHeight);

顺便说一句,我假设你的 randX 实际上是随机的 screenWidth?你那里有屏幕高度(也许它们是相同的?

无论如何,与其这样做,不如做这样的事情:

randXs = rand_FloatRange(screenWidth - tanks[i]->posX);
randZs = rand_FloatRange(screenHeight - tanks[i]->posZ);

这样做的作用是,当坦克接近屏幕边缘时,它会减少你的随机范围,以使其保持在范围内。

这应该确保您不会获得屏幕外的随机值!如果不起作用,请报告!祝你好运!


编辑:

回顾我的解决方案

并再次检查您的代码,我实际上不确定我的解决方案是否会给出正确的结果。但请确保正确处理屏幕宽度和高度。也许这就是问题所在?

此外,您可以单独处理 2 轴。如果我是你,我会这样做。如下:

if(randXs < tanks[i]->givePosX())  
{
  tanks[i]->posX = tanks[i]->givePosX() - 0.1;
}
else if(randXs > tanks[i]->givePosX())
{
  tanks[i]->posX= tanks[i]->givePosX() +0.1;
}
if(randZs > tanks[i]->givePosZ() )
{
  tanks[i]->posZ= tanks[i]->givePosZ() +0.1;
}
else if (randZs < tanks[i]->givePosZ() )
{
  tanks[i]->posZ= tanks[i]->givePosZ() - 0.1;
}

请注意,重要的是在 else 之后有一个相反的 if 语句,而不仅仅是一个 else 块。这就是我的意思:

这样做: 如果 (... { ... } 否则如果(...与第一个相反 if) { ... }

而不是:

if (...)
{
...
}
else //no if here. 
{
...
}

否则,如果随机值与他自己的值相同,坦克仍将移动。我假设你想要的是,如果随机值相同,它应该静止不动(在特定方向上)。例如,如果我们有一个 x 值为 5 的坦克,并且我们随机分配 x 值为 5,则 x 中应该没有移动,上面的代码将确保这一点。

在您的情况下,您有一个没有条件的 else 块,因此您的坦克可能会离开屏幕(不过应该只是一瞬间)。我发布的第一个解决方案,我很确定是错误的,但我会把它留在那里,以免让您感到困惑(我的解决方案突然改变!