1

嘿,伙计们,我遇到了这个问题,我就是无法让我的敌人转向我的角色,我已经尝试了几天并且已经四处询问,但没有任何问题,所以如果你能给我一些想法,那就太棒了。

这是我的敌人类,现在在这段代码中,这里一切正常,它做我想要的,但是它面向鼠标而不是我的角色

class Class1
    {
         Character character = new Character();
         EnemyShip blah = new EnemyShip();

        Texture2D texture;
        Rectangle rectangle;

        public Vector2 origin;
        public Vector2 velocity;
        public Vector2 position;
        float rotation;
        const float forwardvelocity = 1f;
        float friction = 0.1f;

        public Vector2 distance;


        public void LoadContent(ContentManager Content)
        {
            texture = Content.Load<Texture2D>("Ships/WarShip");
            position = new Vector2(800, 300);
        }




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

            distance.X = mouse.X - position.X; //  these two line are the one i want to 
            distance.Y = mouse.Y - position.Y; // change however when i change mouse.X to //say character.Position.X my enemy ship moves towards the top left corner of the screen //and not the character

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

            position = velocity + position;

            velocity.X = (float)Math.Cos(rotation) * forwardvelocity;
            velocity.Y = (float)Math.Sin(rotation) * forwardvelocity;

            rectangle = new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height);
            origin = new Vector2(rectangle.Width / 2, rectangle.Height / 2);
        }

        public void Draw(SpriteBatch spriteBatch, GameTime gameTime)
        {
            spriteBatch.Draw(texture, position, null, Color.White, rotation, origin, 1f, SpriteEffects.None, 0);
        }
    }
    }

这是我的角色课

class Character
    {
        public Texture2D texture;
        public float angle = 0;
        public Vector2 velocity;
        public Vector2 Position = new Vector2(0, 0);
        public float forwardvelocity = 5;
        public float friction = 0.03f;
        public Vector2 origin;

        public Rectangle sourcerectangle;

        public void LoadContent(ContentManager Content)
        {
            texture = Content.Load<Texture2D>("Ships/charactership");

        }

        public void Update(GameTime gameTime)
        {
            Position += velocity;
            if (Keyboard.GetState().IsKeyDown(Keys.W))
            {
                velocity.X = (float)Math.Cos(angle ) * forwardvelocity;
                velocity.Y = (float)Math.Sin(angle) * forwardvelocity;
            }
            if (Keyboard.GetState().IsKeyDown(Keys.S))
            {
                velocity.X = -(float)Math.Cos(angle) * forwardvelocity;
                velocity.Y = -(float)Math.Sin(angle) * forwardvelocity;
            }
                if (Keyboard.GetState().IsKeyDown(Keys.A)) angle -= 0.05f;

                if (Keyboard.GetState().IsKeyDown(Keys.D)) angle += 0.05f;

                else if (velocity != Vector2.Zero)
                {
                    float i = velocity.X;
                    float j = velocity.Y;

                    velocity.X = i -= friction * i;
                    velocity.Y = j -= friction * j;
                }
            //--------------------------------------------------------------

        }



        public void Draw(SpriteBatch spriteBatch)
        {

             sourcerectangle = new Rectangle(0, 0, texture.Width, texture.Height);
            origin = new Vector2(texture.Width / 2, texture.Height / 2);

            spriteBatch.Draw(texture, Position, sourcerectangle, Color.White, angle, origin, 1.0f, SpriteEffects.None, 0);
        }


    }

}
4

2 回答 2

5

我注意到你CharacterClass1. 它被设置为,new Character() 但没有其他任何事情发生过。我猜这意味着你的实际 Character在你的Game某个地方,而这个另一个Character完全Class1 是一个完全不同的变量。所以很自然,使用它Position是没有意义的。

由于您的敌人依赖Character变量进行自己的计算,因此传入依赖项:

public void Update(Character c, GameTime gameTime)
{
    MouseState mouse = Mouse.GetState();
    distance.X = c.Position.X - position.X;
    distance.Y = c.Position.Y - position.Y;
...

然后在顶层Game或其他什么:

//your actual character
Character c;
...
//in Game.Update
c.Update(gameTime);
c1.Update(c, gameTime);

然后你可以简单地删除它Character character = new Character();Class1因为它没用。

有一些“更懒惰”的方法,例如单例和其他static与 ness 相关的方法,但我不推荐这些。

于 2013-08-20T09:58:21.760 回答
0

你说“Class1”是你的敌人......

class Class1
{
     Character character = new Character();
     EnemyShip blah = new EnemyShip();

在你的敌人类中实例化角色没有任何意义,我认为你没有在你的敌人类中引用正确的角色实例。

似乎你的敌人类中的字符变量永远不会更新,它总是在(0,0)的原因可能是什么

于 2013-08-20T09:54:38.137 回答