我目前正在使用xna创建动画。 当帧高度,宽度和持续时间在所有帧之间相同时,我没有问题为spritesheet设置动画。
但是我没有发现它非常灵活,我想在没有相同frameHeight / Width的spritesheet的情况下制作动画,更重要的是没有持续的持续时间。
是否有任何教程或代码示例可供学习?
编辑: 我想到这样的事情,但我不能让它发挥作用:
public void Update(GameTime gameTime)
{
if (elapsedTime > frameTime)
{
currentFrame++;
elapsedTime = 0;
}
sourceRect = new Rectangle(newpositionX, newpositionY, newframeWidth, newframeHeight);
frametime = newframetime
}
enter code here
难点在于如何准确指定每个帧的新位置和新帧时间。
答案 0 :(得分:1)
你是如何为精灵表制作动画的。
This教程展示了一个带有4x4精灵表的舞蹈笑脸。 因此它有16帧:
| 1| 2| 3| 4|
| 5| 6| 7| 8|
| 9|10|11|12|
|13|14|15|16|
完成动画的循环(在Update()中):
public void Update()
{
currentFrame++;
if (currentFrame == totalFrames)
currentFrame = 0;
}
如果您想仅使用奇数的帧1,3,5,7,9,11,13,15
而不使用偶数帧而不是currentFrame++;
,则可以使用currentFrame+=2
对于框架高度/宽度不同的精灵表,您可以使用scaling。 如何在精灵表中导航取决于您,这意味着您不限于具有相同高度/宽度的精灵表。
至于持续时间,在我链接到的教程中,我会尽可能快地更新笑脸的帧,因为没有实施控制来处理时间延迟(意味着每秒或每隔一次更新.5因此,在当前状态下,Draw()方法将被调用60次。
答案 1 :(得分:1)
我做过这个班级
public void Update(GameTime gameTime) { currentAnimation =(currentAnimation + 1)%ExtractionXml.AnimationCount;
elapsedTime += (int)gameTime.ElapsedGameTime.TotalMilliseconds;
if (currentFrame == animationData.Animations[currentAnimation].Frames.Length)
{
if (Looping == true)
currentFrame = 0;
}
if (elapsedTime > animationData.Animations[currentAnimation].Frames[currentFrame].Duration*1000 && currentFrame <= animationData.Animations[currentAnimation].Frames.Length-1)
{
Height = animationData.Animations[currentAnimation].Frames[currentFrame].Height;
Width = animationData.Animations[currentAnimation].Frames[currentFrame].Width;
X = animationData.Animations[currentAnimation].Frames[currentFrame].X;
Y = animationData.Animations[currentAnimation].Frames[currentFrame].Y;
sourceRect = new Rectangle(X, Y, Width, Height);
//destinationRect = new Rectangle((int)Position.X - (int)(Width * scale) / 2, (int)Position.Y - (int)(Height * scale) / 2, (int)(Width * scale), (int)(Height * scale));
destinationRect = new Rectangle(scale* ((int)Position.X - (animationData.Animations[currentAnimation].Frames[currentFrame].Width / 2) + (animationData.Animations[currentAnimation].Frames[currentFrame].OffSetX))
, scale * ((int)Position.Y - (animationData.Animations[currentAnimation].Frames[currentFrame].Height / 2) + (animationData.Animations[currentAnimation].Frames[currentFrame].OffSetY))
, scale * animationData.Animations[currentAnimation].Frames[currentFrame].Width
, scale * animationData.Animations[currentAnimation].Frames[currentFrame].Height);
//destinationRect = new Rectangle(0 , 0 , animationData.Animations[currentAnimation].Frames[currentFrame].Width, animationData.Animations[currentAnimation].Frames[currentFrame].Height);
currentFrame++;
elapsedTime = 0;
}
}