我和我的朋友决定为自己制作一款游戏。它采用口袋妖怪和旧的 Harvest Moon 图形风格。我一直在用动画做一些测试,我让它工作了。我的播放器 Sprite Sheet 有八个图像(每个方向 2 个)。
但是,当我按住向上箭头键和向左或向右或向下箭头键和向左或向右时,它试图同时执行两个动画。我知道必须有办法解决这个问题,我只需要有人告诉我怎么做。
这是我为我的播放器设置的动画类:
public class Animation
{
Texture2D texture;
Rectangle rectangle;
public Vector2 position;
Vector2 origin;
Vector2 velocity;
int currentFrame;
int frameHeight;
int frameWidth;
float timer;
float interval = 75;
public Animation(Texture2D newTexture, Vector2 newPosition, int newFrameHeight, int newFrameWidth)
{
texture = newTexture;
position = newPosition;
frameWidth = newFrameWidth;
frameHeight = newFrameHeight;
}
public void Update(GameTime gameTime)
{
rectangle = new Rectangle(currentFrame * frameWidth, 0, frameWidth, frameHeight);
origin = new Vector2(rectangle.Width / 2, rectangle.Height / 2);
position = position + velocity;
// Comment Out For Camera!!!!
if (position.X <= 0 + 10) position.X = 0 + 10;
if (position.X >= 1920 - rectangle.Width + 5) position.X = 1920 - rectangle.Width + 5;
if (position.Y <= 0 + 10) position.Y = 0 + 10;
if (position.Y >= 1080 - rectangle.Height + 7) position.Y = 1080 - rectangle.Height + 7;
if (Keyboard.GetState().IsKeyDown(Keys.Right))
{
AnimateRight(gameTime);
velocity.X = 2;
}
else if (Keyboard.GetState().IsKeyDown(Keys.Left))
{
AnimateLeft(gameTime);
velocity.X = -2;
}
else velocity = Vector2.Zero;
if (Keyboard.GetState().IsKeyDown(Keys.Up))
{
AnimateUp(gameTime);
velocity.Y = -2;
}
if (Keyboard.GetState().IsKeyDown(Keys.Down))
{
AnimateDown(gameTime);
velocity.Y = 2;
}
}
public void AnimateRight(GameTime gameTime)
{
timer += (float)gameTime.ElapsedGameTime.TotalMilliseconds / 2;
if (timer > interval)
{
currentFrame++;
timer = 0;
if (currentFrame > 1)
currentFrame = 0;
}
}
public void AnimateLeft(GameTime gameTime)
{
timer += (float)gameTime.ElapsedGameTime.TotalMilliseconds / 2;
if (timer > interval)
{
currentFrame++;
timer = 0;
if (currentFrame > 3 || currentFrame < 2)
currentFrame = 2;
}
}
public void AnimateUp(GameTime gameTime)
{
timer += (float)gameTime.ElapsedGameTime.TotalMilliseconds / 2;
if (timer > interval)
{
currentFrame++;
timer = 0;
if (currentFrame > 5 || currentFrame < 4)
currentFrame = 4;
}
}
public void AnimateDown(GameTime gameTime)
{
timer += (float)gameTime.ElapsedGameTime.TotalMilliseconds / 2;
if (timer > interval)
{
currentFrame++;
timer = 0;
if (currentFrame > 7 || currentFrame < 6)
currentFrame = 6;
}
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(texture, position, rectangle, Color.White, 0f, origin, 1.0f, SpriteEffects.None, 0);
}
}