2017-03-09 32 views
0

(在您閱讀之前,我很擔心在這裏發帖,因爲我之前的問題有很多負面答覆......請儘量保持好心態,我是一名學生,無法寫信「完美」的代碼呢)XNA Smooth Downward Swoop Motion

我目前正試圖弄清楚如何使蚊子(Texture2D)向下撲翼,然後回到它的原始位置。 目前蚊子只是在屏幕邊界內左右移動,沒有Y的移動。

我已經通過一個調試器,並觀察它的Y座標。我的蚊子確實在猛撲下來,然後又回到了上面......但是,它們的速度太快了,人眼看不到它。

因此,我需要一種方式順利地將它們向下移動,以便它實際上可見。 我目前無法將圖像嵌入到我的帖子中,但是我已經制作了一個GIF來展示我想要的效果。 Here's a link to my GIF

事情我已經嘗試:

  • 複製我的移動代碼(如下圖所示)的第一行,並改變它,這樣它只會影響到Y座標。
    • 結果:蚊子仍然飛得太快,看不到。
  • 改變我的mosquitoe的velocity.Y包含一個不是0的Y,這樣我的運動代碼也會改變Y位置而不是僅僅是X位置。
    • 結果:博弈陷入無限循環,因爲我的移動代碼在update()函數中,代碼從來沒有退出循環,以便它可以更新位置...

這是我在更新中的移動代碼。 蚊子一直向右移動,然後一路向左。

 internal void Update(GameTime GameTime) 
     { 
      position += velocity * (float)GameTime.ElapsedGameTime.TotalSeconds; 

      // Reverses the direction of the mosquito if it hits the bounds 
      if (position.X <= gameBoundingBox.Left || 
       position.X + animationSequence.CelWidth > gameBoundingBox.Right) 
      { 
       velocity.X *= -1; 
      } 
     } 

而這裏的,我有實際飛撲()的代碼...

internal void Swoop(GameTime gameTime) 
    { 
     float originalYPosition = position.Y; 
     bool currentlySwooping = true; 

     while (currentlySwooping) 
     { 
      position.Y++; 

      if (this.BoundingBox.Bottom >= gameBoundingBox.Bottom) 
      { 
       currentlySwooping = false; 
      } 
     } 

     while (!currentlySwooping && position.Y > originalYPosition) 
     { 
      position.Y--; 
     } 
    } 

我不問上的問題在這裏太頻繁,所以我很抱歉,如果我使用的是格式不正確或者我提供的信息太少。 如果您需要了解其他內容,請讓我知道。

+0

你打電話給'突襲'? – Pipe

+0

在我的主遊戲代碼(MosquitoAttackGame.cs)中。如果生成特定數字,我有一個隨機數字生成器,用於調用突襲方法。 我還沒有嘗試你的解決方案,因爲我目前在學校。但是,我會嘗試當我回家:) –

回答

0

有很多方法來實現這一點,但這應該做到這一點。

float originalYPosition = position.Y; 
int swoopDirection = 0; 
internal void Update(GameTime GameTime) 
{ 
    /* Same update code */ 

    if (swoopDirection != 0) 
    { 
     position.Y += swoopDirection; 

     if (swoopDirection == 1 && this.BoundingBox.Bottom >= gameBoundingBox.Bottom) 
     { 
      swoopDirection = -1; 
     } 
     else if (swoopDirection == -1 && position.Y <= originalYPosition) 
     { 
      swoopDirection = 0; 
     } 
    } 
} 
internal void Swoop() 
{ 
    swoopDirection = 1; 
} 

基本上,我們有一個可變swoopDirection,取決於一舉的狀態變化(1下降時和-1上升時)。在更新方法中,我們檢查swoopDirection != 0(我們正在俯衝)。如果我們正在俯衝,我們將方向添加到Y軸並檢查我們是否超出界限。如果我們觸摸底部,我們設置swoopDirection爲-1,所以我們上去。如果我們在原始位置swoopDirection設置爲0,我們停止俯衝。

+0

謝謝!我不得不調整和修改你的代碼,以便它可以與我的遊戲一起工作,但總的來說你的方法確實有效! :) 再次感謝! –

+0

不客氣! – Pipe