2014-09-26 66 views
0

我正在尝试制作一个角色并让他左右走动。虽然我学会了如何制作基本的动画,但我无法弄清楚如何在它们之间切换。如何在C#XNA程序中的动画之间切换?

当角色向左走时,我希望他从“空闲”(animatedSprite)动画切换到“左行走”(animatedSprite2)动画。

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

回答

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

而且应该做你想做的。另外,如果动画有点笨重,我会推荐使用精灵表并创建自己的可以存储所有玩家变量的动画类。如果您决定制作游戏多人游戏,这非常有用。

+0

这工作。非常感谢你。 :) – Kashin 2014-09-27 16:55:13

0

可以说左右步行anmation使用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