2012-06-21 51 views
2

我正在做一些遊戲,現在我正在試圖爲我的坦克實現漫遊行爲,但我無法成功實現它。在遊戲中實現漫步行爲

問題是,它計算它的位置,如果它像(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

回答

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中不應該有任何移動,並且上面的代碼將確保這一點。

在你的情況下,你有一個沒有條件的塊,所以你的坦克可能離開屏幕(它應該只是一瞬間)。我發佈的第一個解決方案,我很確定是錯誤的,但我會留在那裏不要混淆你(我的解決方案突然改變!)

+0

Denzil,感謝您的反饋!這是很好的建議,以及一些很好的循環和新變量來檢查對象的狀態,我會做我想做的,現在我必須去學校,但是回來後我會在這裏發佈我的解決方案。再次感謝這個不錯的實現。 – Takarakaka