2

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

问题是它计算它的位置,如果它像 (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;
}

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

4

1 回答 1

1

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

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

顺便说一句,我假设您的 randXs 实际上是随机到 screenWidth 的?你有 screenHeight 那里(也许他们是一样的?)

无论如何,不​​要这样做,而是做这样的事情:

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 (...) { ... } else if (... 相反第一个 if) { ... }

并不是:

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

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

在你的情况下,你有一个没有条件的 else 块,所以你的坦克可能会离开屏幕(虽然它应该只是瞬间)。我发布的第一个解决方案,我很确定是错误的,但我会把它留在那里以免混淆你(我的解决方案突然改变了!)

于 2012-06-21T22:01:32.977 回答