敌人一直在射击

时间:2012-10-20 17:31:25

标签: c# xna

如果变量nextShot大于变量shotFrequency,我希望敌人射击子弹。每个敌人都应该独立射击。 但目前,每个敌人都在开枪。他们之间没有休息时间。但是我希望他们在镜头之间总是有点休息。我确信敌人的课程有些不对劲,但我不知道该改变什么。请问有人帮帮我吗?

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 = 2.0f;

    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;
            // Does the enemy shot?
            if (enemy.Shot == true)
            // New bullet
              {
                  Vector2 bulletDirection = Vector2.Normalize(Player.playershape.Position - CurrentEnemyPosition) * 200f;
                  bulletslist.Add(new Bullet(CurrentEnemyPosition, bulletDirection, Player.playershape.Position));
              }
        }

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

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

    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 = 1.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 = 0;
            }

        if (!Remove)
        {
            float fMoveTime = (float)gameTime.ElapsedGameTime.TotalSeconds;
            this.vMove = Vector2.Normalize(PlayerPos - this.vPos) * 100f;
            this.vPos += this.vMove * fMoveTime;
            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)
            {
                float fMoveTime = (float)gameTime.ElapsedGameTime.TotalSeconds;
                this.vPos.X += this.vMove.X * fMoveTime;
                this.vPos.Y += this.vMove.Y * fMoveTime;

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

1 个答案:

答案 0 :(得分:4)

您永远不会清除Shot标志。有敌人射击后,只需enemy.Shot = false;

另外,一个很小的提示,当nextShot是&gt; = shotFrequency时,最好这样做:

nextShot -= shotFrequency;

当你超越shotFrequency时,它会解释一点点重叠。