2013-06-01 44 views
0

我正在使用XNA 4.0在c#中做一个小游戏。我已经成功地让我的精灵在所有方向上移动,并使它看起来像是实际上使用数组走路。到目前为止,我只用“向上”键对此进行了测试。问题是,当我按下向上键时,精灵会移动,但是它会快速遍历数组中的所有元素,以至于看起来他正在运行快速获取他要去的大量空间。有什么办法可以减慢纹理彼此间的变化速度,比如暂停方法或其他方法。任何帮助都表示赞赏,谢谢。处理精灵时减缓数组中的纹理更改。

namespace RandomGame 
{ 

    public class Game1 : Microsoft.Xna.Framework.Game 
    { 
     GraphicsDeviceManager graphics; 
     SpriteBatch spriteBatch; 

     Color backColor = Color.FromNonPremultiplied(190, 230, 248, 250); 
     int i = 0; 
     public Game1() 
     { 
      graphics = new GraphicsDeviceManager(this); 
      graphics.IsFullScreen = false; 
      graphics.PreferredBackBufferHeight = 500; 
      graphics.PreferredBackBufferWidth = 800; 
      Content.RootDirectory = "Content"; 
     } 


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

     } 

     Texture2D[] UpTextures = new Texture2D[6]; 
     Texture2D startTexture; 
     Texture2D leftTexture; 
     Texture2D rightTexture; 
     Vector2 position = new Vector2(380, 230); 

     protected override void LoadContent() 
     { 


      spriteBatch = new SpriteBatch(GraphicsDevice); 
      startTexture = Content.Load<Texture2D>("BlueLinkStart"); 
      leftTexture = Content.Load<Texture2D>("BlueLinkLeft"); 
      rightTexture = Content.Load<Texture2D>("BlueLinkRight"); 
      UpTextures[0] = Content.Load<Texture2D>("BlueLinkUp"); 
      UpTextures[1] = Content.Load<Texture2D>("BlueLinkUp2"); 
      UpTextures[2] = Content.Load<Texture2D>("BlueLinkUp3"); 
      UpTextures[3] = Content.Load<Texture2D>("BlueLinkUp4"); 
      UpTextures[4] = Content.Load<Texture2D>("BlueLinkUp5"); 
      UpTextures[5] = Content.Load<Texture2D>("BlueLinkUp6"); 
     } 

     protected override void UnloadContent() 
     { 

     } 

     protected override void Update(GameTime gameTime) 
     { 
      // Allows the game to exit 
      if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) 
       this.Exit(); 

      if (Keyboard.GetState(PlayerIndex.One).IsKeyDown(Keys.Escape)) 
      { 
       this.Exit(); 
      } 
      if (Keyboard.GetState(PlayerIndex.One).IsKeyDown(Keys.Left) && position.X > -3) 
      { 
       position.X -= 2; 

      } 
      if (Keyboard.GetState(PlayerIndex.One).IsKeyDown(Keys.Right) && position.X < 772) 
      { 
       position.X += 2; 
      } 
      if (Keyboard.GetState(PlayerIndex.One).IsKeyDown(Keys.Up) && position.Y > -3) 
      { 
       position.Y -= 2; 
      } 
      if (Keyboard.GetState(PlayerIndex.One).IsKeyDown(Keys.Down) && position.Y < 472) 
      { 
       position.Y += 2; 
      } 
      base.Update(gameTime); 
     } 

     protected override void Draw(GameTime gameTime) 
     { 
      GraphicsDevice.Clear(Color.FromNonPremultiplied(188, 231, 241, 255)); 
      if (Keyboard.GetState(PlayerIndex.One).IsKeyDown(Keys.Left)) 
      { 
       spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend); 
       spriteBatch.Draw(leftTexture, position, Color.White); 
       spriteBatch.End(); 
       base.Draw(gameTime); 
      } 
      else if (Keyboard.GetState(PlayerIndex.One).IsKeyDown(Keys.Right)) 
      { 
       spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend); 
       spriteBatch.Draw(rightTexture, position, Color.White); 
       spriteBatch.End(); 
       base.Draw(gameTime); 
      } 
      else if (Keyboard.GetState(PlayerIndex.One).IsKeyDown(Keys.Up)) 
      { 

       spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend); 
       spriteBatch.Draw(UpTextures[i], position, Color.White); 
       spriteBatch.End(); 
       i++; 
       if (i == 6) { i = 0; } 
       base.Draw(gameTime); 
      } 
      else 
      { 
       spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend); 
       spriteBatch.Draw(startTexture, position, Color.White); 
       spriteBatch.End(); 
       base.Draw(gameTime); 
      } 
     } 
    } 
} 

回答

1

是的,有。

首先,您需要一个保存动画状态的变量。你的i可能应该是这样的。但是,您应该将其重命名为animationState以反映其目的。此外,它更容易使其变为floatdouble变量。

然后更新动画是Update()方法的一项任务。你显然依赖于60赫兹的更新频率。对于小型游戏来说这没什么问题,但是对于大型游戏,您应该考虑可能的缓慢起伏。如果你有n精灵,你想改变精灵每m毫秒,那么你更新animationState如下:

animationState += updateDuration * m; 
if(animationState >= n) animationState -= n; 

updateDuration是自上次更新的时间。所以对于60 Hz这是1000.0/60

然后你需要绘制在Draw()方法正确精灵:

spriteBatch.Draw(UpTextures[(int)animationState], position, Color.White); 
+0

惯于这项事业的索引越界异常? – ItalianStallion

+0

它不应该。 'animationState'总是'> = 0'和'