Вы забыли сбросить таймер, вы можете сделать это, когда достигнете условия timer interval
. Кроме того, 50 мс кажется слишком малым для интервала, может быть, вы могли бы сделать как 400 мс?
Кроме того, выглядит хорошо, он будет делать то, что вы хотите.
Кроме того, вы можете посмотреть анимированных спрайтов для ходьбы. То, что вы делаете, - это создаете изображение с шагающими анимационными спрайтами один рядом с другим, одинакового размера. Вы рисуете только часть этого изображения (один спрайт) и перемещаетесь по ним в зависимости от времени.
Вот краткий код для анимированной текстуры:
class AnimatedTexture2D : Texture2D
{
int _numberOfImages;
int _currentImage = 0;
int _timeInterval;
int _spriteWidth;
public Rectangle DrawFromRectangle
{
get
{
return new Rectangle(_currentImage * _spriteWidth, 0, _spriteWidth, this.Height);
}
}
public AnimatedTexture2D(Texture2D entireImage, int spriteWidth, int numberOfImages, int timeInterval)
: base(entireImage.GraphicsDevice, entireImage.Width, entireImage.Height)
{
_numberOfImages = numberOfImages;
_timeInterval = timeInterval;
_spriteWidth = spriteWidth;
Color[] data = new Color[entireImage.Width * entireImage.Height];
entireImage.GetData<Color>(0, new Rectangle(0, 0, entireImage.Width, entireImage.Height), data, 0, entireImage.Width * entireImage.Height);
this.SetData<Color>(data);
}
public void Animate(GameTime gameTime)
{
int totalImageTime = _timeInterval * _numberOfImages;
int currentPoint = (int)gameTime.TotalGameTime.TotalMilliseconds % totalImageTime;
_currentImage = currentPoint / _timeInterval;
}
}
Использование довольно просто:
1) объявить где-нибудь:
AnimatedTexture2D animatedTexture;
2) запустите его с вашей текстурой (у меня была последовательность 2560x64 из 40 64 * 64 изображений), где отдельные изображения расположены рядом друг с другом по горизонтали:
animatedTexture = new AnimatedTexture2D(Content.Load<Texture2D>(@"Textures\Loading"), 64, 40, 20);
3) в вашем методе Update () вызовите
animatedTexture.Animate(gameTime);
4) в вашем методе Draw () вызовите:
SpriteBatch.Draw(animatedTexture, new Rectangle(20, 20, 64, 64), animatedTexture.DrawFromRectangle, Color.White);
Не забудьте про DrawFromRectangle в части 4! (обратите внимание, что целевой прямоугольник использует объявленную ширину отдельной детали, а не всю ширину текстуры, которая в моем тесте составляет 2560 пикселей)
Теперь в своем коде вы можете забыть часть интервала и часть игрового времени, и вы можете просто использовать ее вместо стандартной по умолчанию!
Кроме того, если вам не нравится мой временный код (он очень прост, но отсутствует способ сброса анимации), измените его так, чтобы у вас была переменная истекшего времени, и добавьте к ней, как вы делаете в своем собственном коде, и используйте это, чтобы изменить _currentImage. Вы даже можете сделать эту переменную общедоступной, чтобы использовать ее для сброса анимации (или для ее установки в указанной точке).
Конечно, вы также можете сделать по умолчанию анимированную текстуру с одним кадром, чтобы вы могли использовать один и тот же код везде. Надеюсь, это поможет!