2016-11-30 68 views
-2

所以我製作的遊戲和小行星非常相似,我不確定如何讓小行星產生出屏幕。任何幫助將非常感激。下面是小行星當前代碼:產卵物體不在屏幕上

class asteroid 
{ 
    Texture2D m_txr; 
    public Vector2 velocity, position; 
    public BoundingSphere circle; 
    public Rectangle rect; 

    public asteroid(Texture2D txr, Vector2 screen_size, Random RNG) 
    { 
     m_txr = txr; 
     position = Vector2.Zero; 
     position.X = RNG.Next(0, (int)screen_size.X); 
     position.Y = RNG.Next(0, (int)screen_size.Y); 

     circle = new BoundingSphere(new Vector3(position.X + m_txr.Width/2, position.Y + m_txr.Height/2, 0), m_txr.Width/2); 
     velocity = new Vector2(0, 0); 

     while (velocity.X == 0 || velocity.Y == 0) 
      velocity = new Vector2((float)RNG.NextDouble() * RNG.Next(-2, 2), (float)RNG.NextDouble() * RNG.Next(-2, 2)); 

     rect = new Rectangle((int)position.X, (int)position.Y, m_txr.Width, m_txr.Height); 
    } 

    public void update(Vector2 screen_size) 
    { 
     circle.Center.X = position.X + m_txr.Width/2; 
     circle.Center.Y = position.Y + m_txr.Height/2; 

     rect.X = (int)position.X; 
     rect.Y = (int)position.Y; 


     position += velocity; 

     if (position.X > screen_size.X + m_txr.Width) 
      position.X = 0; 
     if (position.X < 0 - m_txr.Width) 
      position.X = screen_size.X; 
     if (position.Y > screen_size.Y + m_txr.Height) 
      position.Y = 0; 
     if (position.Y < 0 - m_txr.Height) 
      position = screen_size; 
    } 

    public void drawme(SpriteBatch sb) 
    { 
     sb.Draw(m_txr, position, Color.White); 
    } 
} 

感謝

+0

爲什麼你想讓它們在屏幕之外產卵?其次你通過在屏幕的大小上限制「RNG.Next」中的產卵,所以增加這個限制並且它應該被解決 – Kyra

回答

0

你限制在asteriod生成方法自己產卵,因爲您根據屏幕的大小randomnly位置,這應該修復它:

public asteroid(Texture2D txr, Vector2 screen_size, Random RNG) 
{ 
    m_txr = txr; 
    position = Vector2.Zero; 
    position.X = RNG.Next(0, (int)screen_size.X + 10); 
    position.Y = RNG.Next(0, (int)screen_size.Y + 10); 

    circle = new BoundingSphere(new Vector3(position.X + m_txr.Width/2, position.Y + m_txr.Height/2, 0), m_txr.Width/2); 
    velocity = new Vector2(0, 0); 

    while (velocity.X == 0 || velocity.Y == 0) 
     velocity = new Vector2((float)RNG.NextDouble() * RNG.Next(-2, 2), (float)RNG.NextDouble() * RNG.Next(-2, 2)); 

    rect = new Rectangle((int)position.X, (int)position.Y, m_txr.Width, m_txr.Height); 
} 
+0

我認爲這是不正確的,Tomalele希望小行星只在*之外產卵屏幕。 –

+0

我對這個問題的理解有點不同,我的理解是,他希望他們在屏幕上和屏幕上顯示出來,只是在屏幕上。即使你的解釋是正確的,解決方案也是類似的,他是基於隨機生成的,所以改變參數讓它們在想要的地方生成 – Kyra

+0

解決方案是類似的,但是這並不能使你的答案正確。 –

1

對不起,由於困惑和久違,我完全忘了這個問題。

這是我想出來的解決方案,如果有人需要這個;

  // possition 
     int XorY = RNG.Next(0, 2); 
     if (XorY == 0) // top or bottom 
     { 
      int TorB = RNG.Next(0, 2); 
      if (TorB == 0) // top 
      { 
       position.X = RNG.Next(0, (int)screen_size.X); 
       position.Y = 0 - m_txr.Width; 
      } 
      else if (TorB == 1) // bottom 
      { 
       position.X = RNG.Next(0, (int)screen_size.X); 
       position.Y = (int)screen_size.Y; 
      } 
     } 
     else if (XorY == 1) // sides 
     { 
      int LorR = RNG.Next(0, 2); 
      if (LorR == 0) // left side 
      { 
       position.X = 0 - m_txr.Width; 
       position.Y = RNG.Next(0, (int)screen_size.Y); 
      } 
      else if (LorR == 1) // right side 
      { 
       position.X = (int)screen_size.X; 
       position.Y = RNG.Next(0, (int)screen_size.Y); 
      } 
     }