2012-10-22 39 views
1

我想让每个敌人独立射击一颗子弹。如果敌人的子弹离开了屏幕,敌人可以射出新的子弹。不早。但是现在,他们的屏幕总是只有一颗而不是三颗。我有三个敌人,所以他们最多可以同时在屏幕上显示三颗子弹,而不仅仅是一颗。 有什么不对?屏幕上只有一颗子弹。我怎样才能解决这个问题?

public class Map 
{ 
    Texture2D myEnemy, myBullet; 
    Player Player; 
    List<Enemy> enemieslist = new List<Enemy>(); 
    List<Bullet> bulletslist = new List<Bullet>(); 

    float fNextEnemy = 0.0f; 
    float fEnemyFreq = 3.0f; 
    int fMaxEnemy = 3; 

    Vector2 Startposition = new Vector2(200, 200); 
    Vector2 currentEnemyPosition; 

    GraphicsDeviceManager graphicsDevice; 

    public Map(GraphicsDeviceManager device) 
    { 
     graphicsDevice = device; 

    } 

    public void Load(ContentManager content) 
    { 
    myEnemy = content.Load<Texture2D>("enemy"); 
    myBullet = content.Load<Texture2D>("bullet"); 
    Player = new Player(graphicsDevice); 
    Player.Load(content); 
    } 

    public void Update(GameTime gameTime) 
    { 
     Player.Update(gameTime); 
     float delta = (float)gameTime.ElapsedGameTime.TotalSeconds; 

     for(int i = enemieslist.Count - 1; i >= 0; i--) 
     { 
     // Update Enemy 
     Enemy enemy = enemieslist[i]; 
     enemy.Update(gameTime, this.graphicsDevice, Player.playershape.Position, delta); 
     currentEnemyPosition = enemy.Bulletstartposition; 
     // Try to remove an enemy 
     if (enemy.Remove == true) 
     { 
      enemieslist.Remove(enemy); 
      enemy.Remove = false; 
     } 

     // Does the enemy shot? 
     if ((enemy.Shot == true) && (bulletslist.Count < 1)) 
     // New bullet 
      { 
      Vector2 bulletDirection = Vector2.Normalize(Player.playershape.Position - currentEnemyPosition) * 200f; 
      bulletslist.Add(new Bullet(currentEnemyPosition, bulletDirection, Player.playershape.Position)); 
      enemy.Shot = false; 
      } 
     } 

     this.fNextEnemy += delta; 
     //New enemy 
     if (fMaxEnemy > 0) 
     { 
     if ((this.fNextEnemy >= fEnemyFreq) && (enemieslist.Count < 3)) 
     { 
      Vector2 enemyDirection = Vector2.Normalize(Player.playershape.Position - Startposition) * 100f; 
      enemieslist.Add(new Enemy(Startposition, enemyDirection, Player.playershape.Position)); 
      fMaxEnemy -= 1; 
      fNextEnemy -= fEnemyFreq; 
     } 
     } 

    for(int i = bulletslist.Count - 1; i >= 0; i--) 
    { 
     // Update Bullet 
     Bullet bullets = bulletslist[i]; 
     bullets.Update(gameTime, this.graphicsDevice, delta); 

     // Try to remove a bullet... Collision, hit, or outside screen. 
     if (bullets.Remove == true) 
      bulletslist.Remove(bullets); 
     bullets.Remove = false; 
    }    
    } 

    public void Draw(SpriteBatch batch) 
    { 

     Player.Draw(batch); 
     foreach (Enemy enemies in enemieslist) 
     { 
      enemies.Draw(batch, myEnemy); 
     } 
     foreach (Bullet bullets in bulletslist) 
     { 
      bullets.Draw(batch, myBullet); 
     } 
    }  
} 

public class Enemy 
{ 
private float nextShot = 0; 
private float shotFrequency = 2.0f; 

    Vector2 vPos; 
    Vector2 vMove; 
    Vector2 vPlayer; 
    public Vector2 Bulletstartposition; 
    public bool Remove; 
    public bool Shot; 

    public Enemy(Vector2 Pos, Vector2 Move, Vector2 Player) 
    { 
     this.vPos = Pos; 
     this.vMove = Move; 
     this.vPlayer = Player; 
     this.Remove = false; 
     this.Shot = false; 
    } 

    public void Update(GameTime gameTime, GraphicsDeviceManager graphics, Vector2 PlayerPos, float delta) 
    {   
     nextShot += delta; 

     if (nextShot >= shotFrequency) 
      { 
      this.Shot = true; 
      nextShot -= shotFrequency; 
      } 

     if (!Remove) 
     { 
      this.vMove = Vector2.Normalize(PlayerPos - this.vPos) * 100f; 
      this.vPos += this.vMove * delta; 
      Bulletstartposition = this.vPos; 

      if (this.vPos.X > graphics.PreferredBackBufferWidth + 1) 
      { 
       this.Remove = true; 
      } 

      else if (this.vPos.X < -20) 
      { 
       this.Remove = true; 
      } 

      if (this.vPos.Y > graphics.PreferredBackBufferHeight + 1) 
      { 
       this.Remove = true; 
      } 

      else if (this.vPos.Y < -20) 
      { 
       this.Remove = true; 
      } 
     } 
    } 

    public void Draw(SpriteBatch spriteBatch, Texture2D myTexture) 
    { 
     if (!Remove) 
     { 
      spriteBatch.Draw(myTexture, this.vPos, Color.White); 
     } 
    } 
} 

public class Bullet 
{ 
    Vector2 vPos; 
    Vector2 vMove; 
    Vector2 vPlayer; 
    public bool Remove; 

    public Bullet(Vector2 Pos, Vector2 Move, Vector2 Player) 
    { 
     this.Remove = false; 
     this.vPos = Pos; 
     this.vMove = Move; 
     this.vPlayer = Player; 
    } 

    public void Update(GameTime gameTime, GraphicsDeviceManager graphics, float delta) 
    { 
      if (!Remove) 
      { 
       this.vPos += this.vMove * delta;     

       if (this.vPos.X > graphics.PreferredBackBufferWidth +1) 
       { 
        this.Remove = true; 
       } 

       else if (this.vPos.X < -20) 
       { 
        this.Remove = true; 
       } 

       if (this.vPos.Y > graphics.PreferredBackBufferHeight +1) 
       { 
        this.Remove = true; 
       } 

       else if (this.vPos.Y < -20) 
       { 
        this.Remove = true; 
       } 
      }   
    } 

    public void Draw(SpriteBatch spriteBatch, Texture2D myTexture) 
    { 
     if (!Remove) 
     { 
      spriteBatch.Draw(myTexture, this.vPos, Color.White); 
     } 
    } 
} 
+3

您是否尝试过为自己调试? –

+0

写一个简短的自包含和正确的例子,展示你的问题http://sscce.org –

回答

2

您需要将每个敌人与它所射击的子弹相关联。最简单的方法是向Bullet类型的Enemy类和Bullet类中的Enemy类型字段添加一个字段。

(如果你想要一个更解耦方法,你可以创建一个接口IFireBullet

取而代之的检查,如果子弹的数量少于一个,你检查如果敌人有一个活跃的子弹。

// Does the enemy shot? 
if ((enemy.Shot == true) && (enemy.Bullet == null)) 
{ 
    … 
} 

当子弹飞出屏幕时,不要忘记清除该字段。 (这是Enemy-field有帮助的地方。)

相关问题