2014-12-09 6 views
0

Итак, я делаю клонирование Space Invaders в XNA. Я создал массив захватчиков и добавил их логику движения. Я хочу, чтобы они стреляли в пули. Поэтому я следил за учебником и использовал только тот код, который мне нужен. Но на экране еще не нарисованы пули. Вот мой класс захватчик, я снял то, что не связано с вопросом от него:XNA - добавление элементов в список и их рисование

class botInvaders 
{ 

    public botInvaders(Texture2D newBulletTex) 
    { 
     bulletsList = new List<blasterLasers>(); 
     bulletTex = newBulletTex; 
     botInvadersHealth = 5; 
     currentDificultyLevel = 1; 
     bulletDelay = 40; 
     isVisible = true; 
    } 

    public static Texture2D botInvaderTex, bulletTex; 
    public static Rectangle botInvaderHitBox; 
    public static Vector2 botInvaderOrigin; 
    public int botInvaderCurrentFrame = 1, botInvaderFrameWidth = 52, botInvaderFrameHeight = 90, bulletDelay, botInvadersHealth, currentDificultyLevel, invaderRows = 3, invaderCollumns = 10; // invaderRows = 5 // For 50 invaders 
    public static Rectangle[,] botInvadersRect; 
    public bool isVisible; 
    public List<blasterLasers> bulletsList; 

    public void LoadContent(ContentManager Content) 
    { 
     botInvaderTex = Content.Load<Texture2D>(".\\gameGraphics\\gameSprites\\botInvaders\\normalInvaders\\invaderShip1"); 
     bulletTex = Content.Load<Texture2D>(".\\gameGraphics\\gameSprites\\botInvaders\\normalInvaders\\botInvaderLaser"); 
     botInvadersRect = new Rectangle[invaderRows, invaderCollumns]; 
    } 

    public void Update(GameTime gameTime) 
    { 
     for (int r = 0; r < invaderRows; r++) 
     { 
      for (int c = 0; c < invaderCollumns; c++) 
      { 
       EnemyShoot(); 
       UpdateBullets(); 
      } 
     } 
    } 

    public void Draw(Texture2D invadersTex, Rectangle[,] invadersDestinationRect, Nullable<Rectangle> invadersSourceRect, Color invadersColor, float invadersRotation, Vector2 invadersOrigin, SpriteEffects invadersEffects, float invadersScale, SpriteBatch spriteBatch) 
    { 
     for (int r = 0; r < invaderRows; r++) 
     { 
      for (int c = 0; c < invaderCollumns; c++) 
      { 
       spriteBatch.Draw(botInvaderTex, botInvadersRect[r, c], botInvaderHitBox, Color.White); 
       foreach (blasterLasers bulletSpawn in bulletsList) 
       { 
        bulletSpawn.Draw(spriteBatch); 
       } 
      } 
     } 
    } 

    public void UpdateBullets() 
    { 
     foreach (blasterLasers bulletsSpawn in bulletsList) 
     { 
      bulletsSpawn.bulletPos.Y = bulletsSpawn.bulletPos.Y + bulletsSpawn.bulletSpeed; 
      if (bulletsSpawn.bulletPos.Y >= -632) 
      { 
       bulletsSpawn.isVisible = false; 
      } 
     } 

     for (int i = 0; i < bulletsList.Count(); i++) 
     { 
      if (!bulletsList[i].isVisible) 
      { 
       bulletsList.RemoveAt(i); 
       i--; 
      } 
     } 
    } 

    public void EnemyShoot() 
    { 
     if (bulletDelay >= 0) 
     { 
      bulletDelay--; 
     } 

     if (bulletDelay <= 0) 
     { 
      blasterLasers newBullet = new blasterLasers(bulletTex); 
      newBullet.bulletPos = new Vector2(botInvaderHitBox.X + botInvaderFrameWidth/2 - newBullet.bulletTex.Width/2, botInvaderHitBox.Y + 90); 
      newBullet.isVisible = true; 
      if (bulletsList.Count() < 20) 
      { 
       bulletsList.Add(newBullet); 
      } 
     } 

     if (bulletDelay == 0) 
     { 
      bulletDelay = 40; 
     } 
    } 
} 

Я инициализировать класс в Game1:

// Create a var 
botInvaders botInvader; 
// Init it 
botInvader = new botInvaders(botInvaders.bulletTex); 
// Load Content 
botInvader.LoadContent(Content); 
// Update 
botInvader.Update(gameTime); 
// Draw Invaders 
botInvader.Draw(botInvaders.botInvaderTex, botInvaders.botInvadersRect, botInvaders.botInvaderHitBox, Color.White, 0f, botInvaders.botInvaderOrigin, SpriteEffects.None, 1.0f, spriteBatch); 

Может быть проблема, что я на самом деле не чертежу пули? Или я не добавляю в список пули? Если я отладки я вижу:

bulletsList Count = 0 
_size 0 
_items [0] null [1] null [2] null [3] null 

EDIT:

blasterLasers класс:

public class blasterLasers 
{ 
    public Texture2D bulletTex; 
    public Vector2 bulletOrigin, bulletPos; 
    public bool isVisible; 
    public float bulletSpeed; 
    public Rectangle boundingBox; 

    public blasterLasers(Texture2D newBulletTex) 
    { 
     bulletSpeed = 10f; 
     bulletTex = newBulletTex; 
     isVisible = false; 
    } 

    public void Draw(SpriteBatch spriteBatch) 
    { 
     spriteBatch.Draw(bulletTex, bulletPos, Color.White); 
    } 
} 

ответ

0

Похоже, вы удаляете пули из bulletslist, когда вы звоните UpdateBullets, поэтому, когда вы идете call Draw, он перебирает пулList, который пуст, поэтому ничего не нарисовано.

+0

Согласовано, обратите внимание, что условие для удаления - Y> = -632, что, вероятно, всегда * true. – BradleyDotNET

+0

Согласен, но без дополнительной информации о blasterLasers сложно сказать. Я предлагаю положить некоторые точки останова и увидеть, если это проблема. –

+0

Собираюсь также опубликовать мой класс blasterLasers. – PowerUser

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