(Xna)我的球员位置没有更新,我需要它让我的敌人跟上

本文关键字:我的 敌人 更新 Xna 位置 | 更新日期: 2023-09-27 18:12:24

enter code here当我将其绘制为字符串时,它只是停留在300,300。我的鼠标总是更新它的Vector2位置。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);
                 }       
            }

    }

(Xna)我的球员位置没有更新,我需要它让我的敌人跟上

我没有阅读你发布的所有代码,但似乎你在敌人类中为玩家创建了一个新的单独实例,该实例从未更新过。

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

你应该将玩家位置的Vector2放入敌人的Update方法中,或者在其他地方处理敌人的移动。也许你可以在你的敌人类中有一个名为Follow的方法,将玩家对象作为参数,然后你可以在处理所有实体移动的地方做如下的事情。它看起来大概像这样:

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

这是可以的,但是如果你想扩展的话,你必须修改你的代码结构。如果没有人在我之前做过,我可能会用更好的解决方案更新这个答案。