【发布时间】:2020-11-22 10:36:44
【问题描述】:
已解决
我正在使用 monogame 制作基本的 2D 平台游戏。到目前为止还没有遇到太多问题,绘制整个spritesheet也没问题。
我想添加正在运行的动画,知道每个精灵都是 41 像素宽和 54 像素高,我将具有正确位置的这些尺寸的源矩形传递给绘图函数。由于某种原因,它现在不再绘制任何东西了。
这是我原来的 Draw 函数,它确实有效:
public virtual void Draw()
{
if(sprite != null)
{
Globals.spriteBatch.Draw(sprite, new Rectangle((int)pos.X, (int)pos.Y, (int)dims.X, (int)dims.Y), null, Color.White, 0.0f, new Vector2(sprite.Bounds.Width / 2, sprite.Bounds.Height / 2), SpriteEffects.None, 0);
}
}
这是一个带有不起作用的源矩形的那个:
public virtual void Draw(Rectangle frame)
{
if (sprite != null)
{
Globals.spriteBatch.Draw(sprite, new Rectangle((int)pos.X, (int)pos.Y, (int)dims.X, (int)dims.Y), frame, Color.White, 0.0f, new Vector2(sprite.Bounds.Width / 2, sprite.Bounds.Height / 2), SpriteEffects.None, 0);
}
}
它被播放器类中的覆盖绘制函数调用:
public override void Draw()
{
base.Draw(new Rectangle(frame * 41, 0, 41, 54));
}
frame 变量使用以下公式在每一帧更新:
frame = (frame + 1) % 4;
【问题讨论】:
-
您确定覆盖的
Draw方法中的frame实际上在范围内吗?它应该有一个从 0 到 animationLength - 1 或这样的值。 -
frame是一个介于 0 和 4 之间的值,我的 spritesheet 比这长得多,所以我认为这不应该是问题所在。我已经调试过,并且该值始终保持在它的范围内。 -
你可以尝试传递
new Rectangle(0, 0, (int)dims.X, (int)dims.Y)而不是框架吗?它绘制动画的第一帧吗? (假设dims是精灵的尺寸,而不是纹理 - 如果不是,请更改它,或者你画的太多了)。我很难相信您发布的代码中有错误。确保sprite是您所期望的,并且在所有范围内都相同。 -
我仍然有
dims作为纹理尺寸,谢谢。这完全解决了它。 -
如果这解决了您的问题,那么您可以将其发布为答案。