2013-04-25 3 views
0

У меня есть астероиды, нерестующие в моей игре с таймером, когда они появляются, и я хочу, чтобы они появлялись по одному за раз. Моя проблема заключается в том, что все они появляются в том же ряду, так как они увеличивают скорость, оставаясь там, где нерестится на астероидах, которые уже почти вышли из экрана. Вот как это выглядит.XNA 4 - Как не создавать астероиды в том же ряду?

http://www.youtube.com/watch?v=9pKXZyzIpGs&feature=youtu.be

Вот мой код обновления.

namespace PixeBlastGame 
{ 
    public class GameUpdate 
    { 
     SpriteBatch spriteBatch; 
     GameTime gameTime; 

     Vector2 vPlayer = new Vector2(0, 720/2); 
     Vector2 vAsteroid; 
     Vector2 velocity; 
     Random rand = new Random(); 

     float spawnTimer; 
     float spawnRate = 1; 
     List<Vector2> Asteroids = new List<Vector2>(); 


     public GameUpdate() 
     { 
      vAsteroid.Y = rand.Next(100, 680); 
      vAsteroid.X = 1100; 
     } 

     public void Update(GameTime theTime) 
     { 
      gameTime = theTime; 
      vPlayer.Y += velocity.Y; 

      float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds; 
      spawnTimer += elapsed; 



      if (spawnTimer >= spawnRate) 
      { 
       Asteroids.Add(new Vector2(1000 ,rand.Next(0, 720))); 
       spawnTimer = 0; 
      } 

      if (Keyboard.GetState().IsKeyDown(Keys.Down)) 
      { 
       velocity.Y = 5; 
      } 

      else if (Keyboard.GetState().IsKeyDown(Keys.Up)) 
      { 
       velocity.Y = -5; 
      } 

      else 
      { 
       velocity.Y = 0; 
      } 

      if (vPlayer.Y > 630)//+ Game1.tPlayer.Height) 
       vPlayer.Y = 630; 
      if (vPlayer.Y < -10) //+ Game1.tPlayer.Height) 
       vPlayer.Y = -10; 


     } 

     public void Draw(SpriteBatch theBatch) 
     { 
      spriteBatch = theBatch; 

      foreach (Vector2 asteroid in Asteroids) //Draw each astroid 
      { 
       DrawAsteroid(asteroid.X, asteroid.Y); 
      } 

      spriteBatch.Begin(); 


      spriteBatch.Draw(Game1.tPlayer, vPlayer, Color.White); 

      spriteBatch.End(); 
     } 

     public void DrawAsteroid(float x, float y) 
     { 
      vAsteroid.X -= 5; vAsteroid.Y = y; 
      spriteBatch.Begin(); 
      spriteBatch.Draw(Game1.tAsteroid, vAsteroid, Color.White); 
      spriteBatch.End(); 
     } 
    } 
} 

Если вам нужно больше кода, чтобы помочь мне, напишите комментарий.

+1

Вам необходимо создать класс для ваших астероидов, так как вам нужно, чтобы сохранить скорость и положение каждого из ваших астероидов, избавиться от vAsteroid. –

+0

Что сказал Робер, я объяснил это в своем ответе на ваш последний вопрос. Потому что каждый астероид будет иметь свою собственную скорость. – Cyral

+0

Проблема, вероятно, связана с «новым случайным». –

ответ

2

Сделать астероид класса

public class Asteroid 
{ 
     public Vector2 Velocity; 
     public Vector2 Position; 
     public Asteroid(Vector2 velocity, vector2 position) 
     { 
     Velocity = velocity; 
     Position = position; 
     } 
} 

Теперь измените свой список:

List<Asteroid> Asteroids = ... 

И теперь вы можете сделать что-то вроде этого

Asteroids[0].Velocity = Whatever 

Таким образом, вы можете изменить каждый пример астероида

Теперь посмотрим на ваш метод вытягивания,

public void DrawAsteroid(float x, float y) 
     { 
      vAsteroid.X -= 5; vAsteroid.Y = y; 
      spriteBatch.Begin(); 
      spriteBatch.Draw(Game1.tAsteroid, vAsteroid, Color.White); 
      spriteBatch.End(); 
     } 

Вы даже не используя х и у значения, так какой смысл? Теперь везде в вашем коде вы ДОЛЖНЫ удалить vASteroid и использовать экземпляр в списке!

Изменение DrawAsteroid к этому:

public void DrawAsteroid(Asteroid a) 
      { 
       spriteBatch.Begin(); 
       spriteBatch.Draw(Game1.tAsteroid, a.Position, Color.White); 
       spriteBatch.End(); 
      } 

И призыв к нему ..

foreach (Asteroid a in Asteroids) //Draw each astroid 
    { 
     DrawAsteroid(a); 
    } 

Теперь мы должны сделать то же самое в обновлении, не обновляют свои позиции в Draw()

Добавить это в Обновление:

foreach (Asteroid a in Asteroids) //Update each astroid 
    { 
     UpdateAsteroid(a, elapsed); 
    } 

и добавить новый метод ...

public void UpdateAsteroid(Asteroid a, float elapsed) 
     { 
      a.Position += a.Velocity * elapsed; 
     } 

Теперь, когда вы икру астероид, вы должны убедиться, что вы скорость добавили!

Asteroids.Add(new Asteroid(new Vector2(0,-10), new Vector2(50,50))); 

Это будет порождать астероид со скоростью от -10 Y и положения из 50,50

+0

Да, но разве это не потребовало бы, чтобы я редактировал каждый астероид? Я хочу, чтобы безлимитные астероиды поступали с одинаковыми атрибутами, затем появлялись, а затем шли прямо на моем экране, а затем постепенно становились быстрее (планирование наступает позже) – freemann098

+0

@ freemann098 это означает, что каждый раз, когда ваш таймер запускается, вы создадите новый астероид и добавите его в свой Список как Cyral объяснил – WiiMaxx

+0

@ freemann098 Да, вам потребуется отредактировать каждый из них, но это объектно-ориентированное программирование, вам понадобится скорость SEPERATE для каждого астероида, теперь вы можете появиться с помощью 'Asteroids.Add (новый Астероид (новый вектор2) (0,5), новый Vector2 (X, Y))), например, для создания астероида со скоростью 5 Y – Cyral

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