无法将类型'WindowsGame24.Bullet'隐式转换为'WindowsGame24.Enemy'

时间:2012-10-27 16:11:01

标签: c# xna

我在Map类的Draw方法中收到此错误消息。怎么了? 我想绘制我在敌人类中创建的子弹。 无法将类型'WindowsGame24.Bullet'隐式转换为'WindowsGame24.Enemy'

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

    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);
        // Try to remove an enemy
        if (enemy.Remove == true)
        {
            enemieslist.Remove(enemy);
            enemy.Remove = 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;
        }
        }

  }

    public void Draw(SpriteBatch batch)
    {
    Player.Draw(batch);
    for (int i = enemieslist.Count - 1; i >= 0; i--) 
        {
            Enemy enemy = enemieslist[i];
            enemy.Draw(batch, myEnemy);
        }
     Enemy bullets;
     for (int i = bullets.bulletslist.Count - 1; i >= 0; i--)
        {
            Enemy bullet = bullets.bulletslist[i];
            bullet.Draw(batch, myBullet);
        } 
    }         
}

public class Enemy
{
    public List<Bullet> bulletslist = new List<Bullet>();

    private float nextShot = 0;
    private float shotFrequency = 2.0f;  
    Vector2 vPos;
    Vector2 vMove;
    Vector2 vPlayer;
    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;

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

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

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

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


        if (!Remove)
        {
            this.vMove = Vector2.Normalize(PlayerPos - this.vPos) * 100f;
            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 batch, Texture2D myTexture)
    {
        if (!Remove)
        {
            batch.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);
        }
    }

}

1 个答案:

答案 0 :(得分:2)

Enemy bullet = bullets.bulletslist[i];

你的子弹现在是敌人吗?

您正在将一个Bullet对象分配给Enemy变量。

不应该是:

Bullet bullet = bullets.bulletslist[i];
编辑:哦,为了基督的缘故!现在,为什么你把子弹放在敌人的班级里,我只是不知道。

for (int i = enemieslist.Count - 1; i >= 0; i--) 
{
    Enemy enemy = enemieslist[i];
    enemy.Draw(batch, myEnemy);

    for (int i = enemy.bulletslist.Count - 1; i >= 0; i--)
    {
        Enemy bullet = enemy.bulletslist[i];
        bullet.Draw(batch, myBullet);
    } 
}