在运动过程中更新纹理

时间:2017-01-18 17:34:50

标签: c# xna monogame

我是新手,所以不能完全确定我是否正确发布,但在创建游戏时我遇到了一些问题。我的主要目标是创造一个自上而下的射击游戏风格的游戏,使用运动的“玩家”#39;根据鼠标的当前位置旋转,可以按下' w'以一定的速度向它移动。

主要问题是,当游戏加载时,动作正是我想要的方式,但纹理本身并没有移动,只有drawRectangle。

Game1.cs:

player = new Player(Content, @"graphics\Player1", 500, 500, spritePosition);
        spritePosition = new Vector2(player.CollisionRectangle.X, player.CollisionRectangle.Y);

protected override void Update(GameTime gameTime)
    {
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
            Exit();
        KeyboardState keyboard = Keyboard.GetState();
        MouseState mouse = Mouse.GetState();
        IsMouseVisible = true;

        distance.X = mouse.X - spritePosition.X;
        distance.Y = mouse.Y - spritePosition.Y;

        //Works out the rotation depending on how far away mouse is from sprite
        rotation = (float)Math.Atan2(distance.Y, distance.X);

        // TODO: Add your update logic here
        spritePosition = spriteVelocity + spritePosition;
        spriteOrigin = new Vector2(player.DrawRectangle.X / 2, player.DrawRectangle.Y / 2);

        if (Keyboard.GetState().IsKeyDown(Keys.W))
        {
            spriteVelocity.X = (float)Math.Cos(rotation) * tangentialVelocity;
            spriteVelocity.Y = (float)Math.Sin(rotation) * tangentialVelocity;
        }
        else if(spriteVelocity != Vector2.Zero)
        {
            Vector2 i = spriteVelocity;

            spriteVelocity = i -= friction * i;
        }

这是更新功能的主要动作代码以及新玩家的创建位置。

Player.cs:

class Player
{
    Texture2D sprite;
    Rectangle drawRectangle;

    int health = 100;

    public Player(ContentManager contentManager, string spriteName, int x , int y, Vector2 velocity)
    {
        LoadContent(contentManager, spriteName, x, y, velocity);
    }

    public Rectangle CollisionRectangle
    {
        get { return drawRectangle; }
    }

    public Rectangle DrawRectangle
    {
        get { return drawRectangle; }
        set { drawRectangle = value; }
    }

    public int Health
    {
        get { return health; }
        set {
            health = value;
                if (health <= 0)
                health = 0;

            if (health > 100)
                health = 100;
            }
    }

    public Vector2 Velocity
    {
        get { return Velocity; }
        set { Velocity = value; }
    }

    public void Update(GameTime gameTime, KeyboardState keyboard, MouseState mouse)
    {

    }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(sprite, drawRectangle, Color.White);
    }

    private void LoadContent(ContentManager contentManager, string spriteName, int x, int y, Vector2 velocity)
    {
        sprite = contentManager.Load<Texture2D>(spriteName);
        drawRectangle = new Rectangle(x - sprite.Width / 2, y - sprite.Height / 2, sprite.Width, sprite.Height);
    }

}

我不知道要包含在player.cs的Update函数中的内容,无论是移动代码还是主要的Game1.cs。

希望这是足够的代码让你们能够提供帮助。很抱歉有很多代码,但我只是不确定错误发生在哪里。

提前致谢

1 个答案:

答案 0 :(得分:0)

对于旋转,你可能想要使用'另一种'spriteBatch.Draw,因为draw函数可以有比你当前使用的参数更多的参数。

完整绘制功能如下:

SpriteBatch.Draw(Texture2D texture, Vector2 position, Rectangle sourceRectangle, Color color, float rotation, Vector2 origin, float scale, SpriteEffects effects, float layerdepht)

如您所见,现在我们有一个可以使用的旋转参数。 所以你的代码看起来像这样:

spriteBatch.Draw(sprite, drawRectangle, null, Color.White, rotation, Vector2.Zero, 1, SpriteEffects.None, 0);

关于你的代码应该去哪里的问题。学习自己将代码放在它所属的位置是很好的,在这种情况下是播放器。因为当你的程序变得更大时,这样做会非常麻烦。

要在您的玩家类中调用更新功能,您只需在Game1的更新中调用player.Update(游戏时间,键盘,鼠标)。