如何在C#XNA程序中切换动画?

时间:2014-09-26 19:50:14

标签: c# animation xna

我试图给角色制作动画,让他左右走路。虽然我已经学会了如何制作基本动画,但我无法弄清楚如何在它们之间切换。

当角色向左走时,我希望他从空闲状态切换到(animatedSprite)动画到“向左走”(动画精灵2)动画。

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace WalkingAnimation
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        private AnimatedSprite animatedSprite, animatedSprite2;
        private Vector2 position = new Vector2(350f, 200f);
        private KeyboardState keyState;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        protected override void Initialize()
        {
            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            Texture2D texture = Content.Load<Texture2D>("Idle");
            Texture2D texture2 = Content.Load<Texture2D>("Run");
            animatedSprite = new AnimatedSprite(texture, 1, 11);
            animatedSprite2 = new AnimatedSprite(texture2, 1, 10);
        }

        protected override void UnloadContent()
        {
        }

        protected override void Update(GameTime gameTime)
        {
            keyState = Keyboard.GetState();

            if (keyState.IsKeyDown(Keys.Q))
            {
                position.X -= 3;
            }
            if (keyState.IsKeyDown(Keys.P))
            {
                position.X += 3;
            }

            base.Update(gameTime);
            animatedSprite.Update();
            animatedSprite2.Update();
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            base.Draw(gameTime);
            animatedSprite.Draw(spriteBatch, position);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

就像你在问题中清楚表达的一样,你需要做的就是存储Boolean来描述这个角色是否空闲:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace WalkingAnimation
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        private AnimatedSprite animatedSprite, animatedSprite2;
        private Vector2 position = new Vector2(350f, 200f);
        private KeyboardState keyState;
        private bool idle;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        protected override void Initialize()
        {
            base.Initialize();
            // Start of as idle
            idle = true;
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // Textures
            Texture2D texture = Content.Load<Texture2D>("Idle");
            Texture2D texture2 = Content.Load<Texture2D>("Run");
            // Animations
            animatedSprite = new AnimatedSprite(texture, 1, 11);
            animatedSprite2 = new AnimatedSprite(texture2, 1, 10);
        }

        protected override void UnloadContent()
        {
        }

        protected override void Update(GameTime gameTime)
        {
            keyState = Keyboard.GetState();
            idle = true; // If the character doesn't move this will stay true

            if (keyState.IsKeyDown(Keys.Q))
            {
                position.X -= 3;
                idle = false;
            }
            if (keyState.IsKeyDown(Keys.P))
            {
                position.X += 3;
                idle = false;
            }

            base.Update(gameTime);
            animatedSprite.Update();
            animatedSprite2.Update();
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            base.Draw(gameTime);
            if(idle)
                animatedSprite.Draw(spriteBatch, position);
            else
                animatedSprite2.Draw(spriteBatch, position);
        }
    }
}

这应该做你想要的。

此外,如果动画有点笨拙,我建议使用精灵表并创建自己的动画类,它可以存储所有玩家变量。如果您决定制作游戏多人游戏,这将非常有用。

答案 1 :(得分:0)

让我们说左右步行使用5帧。而且它是单一纹理。

Function Update

    if State = Left 
        currentFrame +=1;
        if currentFrame > 5 then currentFrame = 0
        texureSource = new rectangle(32*currentFrame,0,32,23);
    end if
    if State = Right
        currentFrame +=1;
        if currentFrame > 5 then currentFrame = 0
        texureSource = new rectangle(32*currentFrame,32,32,23);
    end if

End Function