2016-11-30 4 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

Я не думаю, что это правильно, Томалеле хочет, чтобы астероиды были * только * появляются за пределами экран. –

+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); 
      } 
     }