我正在做一些游戏,现在我正在试图为我的坦克实现漂移行为,但我无法成功实现它。
问题在于它计算它的位置,如果它是(430,130)并使用rand_floatRange函数,它会给出0和屏幕高度(500)之间的一些值,比方说320,它会离开屏幕。< / strong>
我的调试过程根本没有错误。它建立得很好,坦克在战场上移动,但是他们在一段时间后离开屏幕,因为没有限制会阻止他们达到高值(例如:坦克位置为(450,100),屏幕为(600,600) ,如果坦克获得新的目标(它将从那个地方到达(300,200)(它从0到600的值),它将是(750,300)并且它将离开屏幕。
还有其他什么,所以我可以修复它以正常工作并且在screenHeight和screenWidth的范围内。
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;
}
如果需要其他任何东西,如果我有,我会在这里提供。
答案 0 :(得分: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 //no if here.
{
...
}
如果随机值与他自己的值相同,则坦克仍会移动。如果随机值相同,我假设你想要的是它应该静止(在特定方向)。例如,如果我们有一个x值为5的坦克,并且我们随机输出x值为5,则x中应该没有移动,上面的代码将确保这一点。
在你的情况下,你有一个没有条件的else块,所以你的坦克可能会离开屏幕(它应该只是暂时的)。我发布的第一个解决方案,我很确定是错的,但我会把它留在那里,以免混淆你(我的解决方案突然改变了!)