在游戏中实现漫步行为

问题描述:

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

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

我的调试过程根本没有错误。它建造得很好,坦克在现场移动,但是他们在一段时间后离开了屏幕,因为没有限制可以阻止他们达到高值(例如:坦克位置是(450,100),屏幕是(600,600) ,如果坦克获得新的目标(其中的目标将达到(300,200)(从0到600的值),它将会是(750,300),并且它将离开屏幕。 还有什么,所以我可以修复它工作得很好,并在一定范围screenHeight和屏幕宽度的。

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

好吧,让我换句话说/编辑。 @KeithNicholas – Takarakaka

+0

好吧,使用我的计算,我发现一旦它获得目标X和Z值,它就会经过特定的循环并退出,再次获取X和Z值。我在这里必须做的是在场景中引入另一个变量,它将跟踪坦克是否在位,如果是,它可以离开循环。搞清楚如何实施,一旦我得到解决方案,将发布回来。 – Takarakaka

我的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中不应该有任何移动,并且上面的代码将确保这一点。

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

+0

Denzil,感谢您的反馈!这是很好的建议,以及一些很好的循环和新变量来检查对象的状态,我会做我想做的,现在我必须去学校,但是回来后我会在这里发布我的解决方案。再次感谢这个不错的实现。 – Takarakaka