2016-09-06 37 views
0

我試圖實現一個非常基本的2D遊戲,當敵人在屏幕上時,它會在設置點(50和500)之間來回跳動,類似於太空侵略者的事情。我的問題是我只能讓它走向正確,但不能回到左邊並重復。在Monogame/XNA中來回移動敵人

我打亂了自己的編碼,然後纔開始研究它,並且實際上弄清楚了,但是我認爲我有一些可以工作的東西,但是它沒有,我的問題是我不明白爲什麼。 我的代碼應該像一個開關一樣工作,兩個if語句在Update循環中,一個在另一個下去,一個在右邊移動,另一個在左邊移動,我認爲這很好,但是它沒有這樣做。它移動它的權利很好,但是然後左邊的部分不起作用。

那麼,爲什麼下面的代碼不起作用?

namespace _2D_game_num1 
{ 
    class Enemy 
    { 
     int health; 
     Vector2 enemy_location = new Vector2(50, 50); 
     Vector2 enemy_speed = new Vector2(1, 1); 
     Player player = new Player("dummy"); 

     public Enemy() 
     { 
      health = 100; 
     } 

     public void UpdateLocation() 
     { 
      //Vector2 player_pos = player.GetLocation(); 
      //if (player_pos.X < 200) 
      // Using the players location to figure out where the enemy should move 
      bool right = true; 
      bool left = false; 
      if (right) 
      { 
       enemy_location.X += enemy_speed.X; 
       if (enemy_location.X == 500) 
       { 
        right = false; 
        left = true; 
       } 
      } 

      if (left) 
      { 
       enemy_location.X -= enemy_speed.X; 
       if (enemy_location.X == 50) 
       { 
        right = true; 
        left = false; 
       } 
      } 

     } 

     public Vector2 GetLocation() 
     { 
      return enemy_location; 
     } 


    } 
} 

然後在主遊戲類中我擁有它so enemy1.UpdateLocation();是正確的更新部分(以及我的球員運動,工作正常)。

+0

你不需要'right'和'left'變量。通過擁有一個「正確」變量來簡化事物。如果這是真的,你就向右移動。如果它是假的,你就向左移動。此外,要小心,因爲向量是基於浮動,你應該避免測試平等(同樣適用於雙打)。你最好使用'> = 500'和'<= 50'來避免任何「接近但不是500或50」的錯誤。 – itsme86

+0

另外一個問題,你需要做一個單一的'right'變量我正在談論一個類成員,而不是'UpdateLocation()'的局部變量。由於這種方法本地化,因此不能保留其價值。每次你現在調用'UpdateLocation()',它都會將'right'重置爲'true','left'重置爲'false'。這可能是你遇到的主要問題。 – itsme86

回答

1

試試這個:

public void UpdateLocation() 
    { 
      enemy_location.X += enemy_speed.X; 

      if (enemy_location.X <= 50 || enemy_location.X >= 500) 
      { 
       enemy_speed.X = new Vector2(-enemy_speed.X, enemy_speed.Y); 
      } 
    } 

我們這裏做的是移動基於它的敵人的當前速度。然後,如果位置在屏幕的左側或右側,請更改方向。

有時爲了簡單起見,它是值得的。擺脫leftright標誌,因爲它們只是令人困惑的事情。當你處理Update方法時,你通常會改變某種狀態。以前的方式,leftright狀態每次調用UpdateLocation時都會重置。

順便說一句,你可能要考慮傳遞GameTime到你的Update方法。通常情況下,當你實時移動東西時,你會想要通過某種deltaTime來增加移動,以保持所有設備上的順暢。你可能會越來越喜歡它,因爲默認情況下它會是一個固定的幀速率,但事實並非總是如此,所以這是一個很好的習慣。