2014-11-14 2 views
2

Привет всем Я пытаюсь создать игру, и прямо сейчас у меня есть класс шара, который я хочу в настоящее время создать количество из них через массив, а затем нарисовать затем в игра.XNA рисование и создание массива объектов

В настоящее время, однако, похоже, что это либо создает только один экземпляр баллона, либо только пример 1. Я просматривал это несколько раз, и из того, что, как я понимаю, должен быть цикл по всему размеру массива (в настоящее время установленный в 10) и создание множества шаров, а затем обновление и рисование многих.

Вы не можете делать то, что я сейчас делаю, с массивом? Должен ли я каждый раз создавать каждый объект?

Вот код двух соответствующих классов.

GameLevel: Класс, который создает onjects и рисует их.

 public partial class GameLevel : GameScreen 
     { 
      SpriteBatch spriteBatch; 
      protected Game game; 

      Texture2D balloonTexture; 

      Balloon[] balloons = new Balloon[10]; 

      public GameLevel(Game game, SpriteBatch spriteBatch) 
       : base(game, spriteBatch) 
      { 
       this.game = game; 
       this.spriteBatch = spriteBatch; 
      } 

      public void LoadContent() 
      { 

       for (int i = 0; i < balloons.Length; i++) 
       { 



        int colour; 
        Random random = new Random(); 


        colour = random.Next(1, 6); 

        switch (colour) 
        { 
         case 1: balloonTexture = Game.Content.Load<Texture2D>("Images/BlueBalloon"); 
          break; 
         case 2: balloonTexture = Game.Content.Load<Texture2D>("Images/RedBalloon"); 
          break; 
         case 3: balloonTexture = Game.Content.Load<Texture2D>("Images/YellowBalloon"); 
          break; 
         case 4: balloonTexture = Game.Content.Load<Texture2D>("Images/GreenBalloon"); 
          break; 
         case 5: balloonTexture = Game.Content.Load<Texture2D>("Images/PurpleBalloon"); 
          break; 
        } 
        balloons[i] = new Balloon(new Rectangle(0, 0, 1152, 648), balloonTexture); 
        balloons[i].SetStartPosition(); 
       } 
      } 

      public void Update() 
      { 

       for (int i = 0; i < balloons.Length; i++) 
       { 
        balloons[i].Update(); 
       } 


      } 



      public override void Draw(GameTime gameTime) 
      { 
       for (int i = 0; i < balloons.Length; i++) 
       { 

        balloons[i].Draw(spriteBatch); 
       } 

       base.Draw(gameTime); 
      } 
     } 
    } 

Ballon Класс:

public class Balloon 
    { 

     Vector2 position; 
     Vector2 motion; 
     Rectangle bounds; 
     Rectangle screenBounds; 
     public Texture2D texture; 
     float balloonSpeed = 4; 

     public Balloon(Rectangle screenBounds, Texture2D texture)  
     {  
      this.texture = texture; 
      this.screenBounds = screenBounds; 
     } 

     public Rectangle Bounds 
     { 
      get 
      { 
       bounds.X = (int)position.X; 
       bounds.Y = (int)position.Y; 
       return bounds; 
      } 
     } 


     public void Update() 
     { 
      position += motion * balloonSpeed; 
     } 

     private void CheckWallColision() 
     { 
      if (position.X < 0) 
      { 
       position.X = 0; 
       motion.X *= -1; 
      } 

      if (position.X + texture.Width > screenBounds.Width) 
      { 
       position.X = screenBounds.Width - texture.Width; 
       motion.X *= -1; 
      } 

      if (position.Y < 0) 
      { 
       position.Y = 0; 
       motion.Y *= -1; 
      } 

      if (position.Y + texture.Height > screenBounds.Height) 
      { 

       position.Y = screenBounds.Height - texture.Height; 
       motion.Y *= -1; 
      } 
     } 

     public void SetStartPosition() 
     { 
      Random rand = new Random(); 

      motion = new Vector2(rand.Next(2, 6), -rand.Next(2, 6)); 
      motion.Normalize(); 

      position = new Vector2(rand.Next(100, 500), rand.Next(100, 500)); 

     } 


     public void Draw(SpriteBatch spriteBatch) 
     { 
      spriteBatch.Draw(texture, position, Color.White); 

     } 
    } 
} 
+0

Глядя на ваш код, я подумал, что они все рисуют друг над другом, и позиция не получается правильно рассчитана. Я также предлагаю не создавать новый экземпляр «Случайный» каждый раз и вместо этого хранить один экземпляр. Можно получить одно и то же семя и, следовательно, те же значения. – TyCobb

+0

@TyCobb На самом деле невероятно распространено, чтобы получить одно и то же семя - семя полностью основано на системных часах, поэтому серия объектов «Случайный», созданная в то же время, вернет ту же самую серию значений. Лично я считаю, что это огромный недостаток дизайна. – furkle

+0

Если вы хотите что-то немного больше _random_ при каждом запуске приложения, используйте «Случайное случайное = новое Случайное ((int) DateTime.Now.Ticks & 0x0000FFFF);' http://msdn.microsoft.com/en-us/ library/ctssatww (v = vs.110) .aspx – MickyD

ответ

3

Я считаю, что причина это происходит связано с тем, как Random объект работает. Когда он построен, он использует в качестве своего семени (из которого он будет генерировать все значения) системные часы. Это означает, что если вы одновременно генерируете многочисленные экземпляры Random, каждый из них будет возвращать одну и ту же серию значений. Если вы используете эти значения для позиций, каждый из ваших объектов будет иметь одну и ту же позицию и будет нарисован друг над другом. В вашем случае, потому что они имеют одинаковый размер, похоже, что только один был когда-либо нарисован.

Чтобы исправить это, создайте один экземпляр Random и просто используйте Next() в этом единственном экземпляре, когда вам нужна новая позиция.

Лично я считаю, что это довольно существенный недостаток дизайна - это, кажется, не удивительно интуитивно, что ряд Random объектов, созданных в то же время будет «случайным» в точно так же. Но: это хороший пример того, что «случайные» значения, созданные C# и любым другим языком, на самом деле будут псевдослучайным, а когда дело доходит до псевдослучайности, реализация очень важна.

+0

Я сделал это, изменил случайный на глобальный и назвал следующим в forloops, однако я все еще получаю ту же проблему. – user1719605

+0

@ user1719605 Можете ли вы обновить свой код выше? – furkle

+0

@ user1719605 Кроме того, передаете ли вы один экземпляр «Случайного» в ваш класс шаров? Здесь важно, чтобы «Random» не создавался в «SetStartPosition». – furkle

Смежные вопросы