(Xna)我的球员位置不会更新,我需要它让我的敌人跟随

时间:2015-09-12 15:46:40

标签: c# xna

enter code here当我将它绘制成一个字符串时,它只保持在300,300。我的鼠标总是更新它的Vector2 position.X,position.Y。我需要能够更新我的球员位置或我的敌人不会跟随我的球员。它只是为我设定的某个球员位置。请帮助并感谢你!

class Enemy
    {
        Player p = new Player();

        public Vector2 direction, velocity,position;
        public float speed;
        public Texture2D texture;

        public Enemy()
        {
            speed = 1;
            texture = null;
            position = new Vector2(600, 500);

        }

        public void LoadContent(ContentManager Content)
        {
            texture = Content.Load<Texture2D>("circle");
        }

        public void Update(GameTime gameTime)
        {
            MouseState mouse = Mouse.GetState();

            direction = p.position - position;
            direction.Normalize();
            velocity = direction * speed;
            position += velocity;   
        }

        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(texture, position, Color.Red);

        }


        /*
        direction = p.position - position;
        direction.Normalize();
        velocity = direction * speed;
        position += velocity; 
         */
    }

class Player
    {
        public float rotation, bulletDelay;
        public Vector2 position,velocity,origin;
        public string spriteName;
        public Texture2D texture,bulletTexture;
        List<Bullets> bullets = new List<Bullets>();
        public float speed = 10;
        public float health = 100;

        public Player()
        {
            texture = null;
            spriteName = "playerover";
            position = new Vector2(300, 300);
            bulletDelay = 20;

        }

        public void LoadContent(ContentManager Content)
        {
            texture = Content.Load<Texture2D>(spriteName);
            bulletTexture = Content.Load<Texture2D>("playerbullet");
        }

        public void Draw(SpriteBatch spriteBatch)
        {
            origin = new Vector2(texture.Width / 2, texture.Height / 2);

            spriteBatch.Draw(texture, new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height), null, Color.White, rotation,new Vector2(texture.Width / 2, texture.Height / 2), SpriteEffects.None, 0);

            foreach (Bullets bullet in bullets)
            {
                bullet.Draw(spriteBatch);
            }
        }

        public void Update(GameTime gameTime)
        {

            MouseState curMouse = Mouse.GetState();

            KeyboardState keyState = Keyboard.GetState();

            Vector2 mouseLoc = new Vector2(curMouse.X, curMouse.Y);

            Vector2 direction = mouseLoc - position;

            rotation = (float)(Math.Atan2(direction.Y, direction.X));

            if (keyState.IsKeyDown(Keys.W))
            {
                position.Y -= speed;

            }

            if (keyState.IsKeyDown(Keys.S))
            {
                position.Y += speed;

            }
            if (keyState.IsKeyDown(Keys.A))
            {
                position.X -= speed;

            }
            if (keyState.IsKeyDown(Keys.D))
            {
                position.X += speed;

            }

            if (curMouse.LeftButton == ButtonState.Pressed)
            {
                Shoot();
            }
            UpdateBullets();
        }

        public void UpdateBullets()
        {
            foreach (Bullets bullet in bullets)
            {
                bullet.position += bullet.velocity;
                if (bullet.position.Y <= 5)
                {
                    bullet.isVisible = false;
                }

                if (bullet.position.X <= 5)
                {
                    bullet.isVisible = false;
                }

                if (bullet.position.X >= 785)
                {
                    bullet.isVisible = false;
                }

                if (bullet.position.Y >= 575)
                {
                    bullet.isVisible = false;
                }

            }



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

                }


        }

        public void Shoot()
        {


            if (bulletDelay >= 0)
                bulletDelay--;


            if (bulletDelay <= 0)
            {

                Bullets newBullet = new Bullets(bulletTexture);
                newBullet.velocity = new Vector2((float)Math.Cos(rotation), (float)Math.Sin(rotation)) * 5f + velocity;
                newBullet.position = position + newBullet.velocity * 5;
                newBullet.isVisible = true;

                if (bullets.Count < 20)
                {
                    bullets.Add(newBullet);
                }
            }

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


class Hud
    {
        public SpriteFont font;
        public bool showHud;
        Player p = new Player();
        Enemy e = new Enemy();


        public Hud()
        {
            showHud = true;  
        }

        public void LoadContent(ContentManager Content)
        {
            font = Content.Load<SpriteFont>("font");
        }

        public void Draw(SpriteBatch spriteBatch)
        {
            MouseState mouse = Mouse.GetState();
                if (showHud)
                 {
                spriteBatch.DrawString(font, "Mouse.X = " + mouse.X, new Vector2(10, 0), Color.White);
                spriteBatch.DrawString(font, "Mouse.Y = " + mouse.Y, new Vector2(10, 20), Color.White);
                spriteBatch.DrawString(font, "Health = " + p.health, new Vector2(10, 40), Color.White);
                spriteBatch.DrawString(font, "Pos.Y = " + p.position.Y, new Vector2(10, 60), Color.White);
                spriteBatch.DrawString(font, "Pos.X = " + p.position.X, new Vector2(10, 80), Color.White);
                 }       
            }


    }

1 个答案:

答案 0 :(得分:0)

我没有阅读您发布的所有代码,但似乎您为Enemy类中的玩家创建了一个永不更新的新单独实例。

class Enemy 
{ 
    Player p = new Player();
    //...
}

你应该将Vector2用于玩家位置进入你的敌人Update方法或者在其他地方处理敌人的移动。也许你可以在你的Enemy类中使用一个名为Follow的方法,将Player对象作为参数,然后你可以在处理所有实体移动的地方执行以下操作。它看起来大致如下:

public void UpdateEntities(GameTime gameTime)
{
    player.Update(gameTime);
    enemy.Update(gameTime);

    if(PlayerDistanceFromEnemy() < 50)
        enemy.Follow(player);
}

这是一个非常粗略的指导方针,可能是您以后想要重写的内容,但它会起作用。

对于你的敌人类中的Follow方法:

public void Follow(Player player)
{
    this.p = player;
}

public void Update(GameTime gameTime)
{
    if(p != null)
    {
        //do stuff
    }
}

这将有效,但如果要扩展,则必须处理代码的结构。如果有人在我之前没有这样做,我可能会在以后用更好的解决方案更新这个答案。