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

1 回答 1

1

就在这里。

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

然后更新动画是该Update()方法的任务。您显然依赖于 60 Hz 的更新频率。这对于小型游戏来说是可以的,但对于大型游戏,您应该考虑可能的减速。如果你有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);
于 2013-06-01T07:15:23.777 回答