我正在创建“完美”的 Sprite 打包程序。这是一个 Sprite 打包程序,可确保输出 Sprite 与大多数(如果不是全部)游戏引擎和动画软件兼容。它是一个将图像合并到水平 Sprite 表中的程序。
它将源帧转换(如果需要)到内存中的 BMP
它认为整个图像的左上角像素完全透明(可以配置)
它单独解析每个帧以找到真实的坐标矩形(实际帧开始、结束的位置、其宽度和高度(有时图像可能有很多额外的透明像素)。
<它确定框架框,其具有最大宽度/高度的框架的宽度和高度,以便它足够长以包含每个框架。 (为了获得额外的兼容性,每个框架必须具有相同的尺寸)。
创建宽度为 nFrames * wFrameBox 的输出 Sprite
问题是 - anchor 对齐。目前,它尝试对齐每个框架,使其中心位于框架框中心。
if((wBox / 2) > (frame->realCoordinates.w / 2))
{
xpos = xBoxOffset + ((wBox / 2) - (frame->realCoordinates.w / 2));
}
else
{
xpos = xBoxOffset + ((frame->realCoordinates.w / 2) - (wBox / 2));
}
当动画时,它看起来更好,但仍然存在这种不一致的水平框架位置,因此行走动画看起来像行走和摇晃。
我还尝试了以下方法:
存储最宽帧的真实 x 像素位置并将其用作引用点:
xpos = xBoxOffset + (frame->realCoordinates.x - xRef);
它还给出了更好的结果,表明这仍然不是正确的算法。
老实说,我不知道自己在做什么。
考虑到输出 Sprite 表的宽度为帧数乘以最宽帧的宽度,对齐 Sprite 帧的正确方法是什么(获取绘制下一帧的适当 x 位置)?
最佳答案
您的问题是您首先计算中心,然后计算所需边界框的大小。这就是图像“抖动”的原因,因为每个图像的中心都与原始中心不同。
您应该使用原始边界框的中心作为原点,然后找出每个 Sprite 的大小,跟踪最左边、最右边、最顶部和最底部的非透明像素。这将为您提供避免晃动所需的边界框。
问题是,您会发现大多数 Sprite 已经这样做了,因此原始边界框实际上被定义为绘制覆盖这些非透明像素的整个 Sprite 序列的最小空间。
删除未使用的 Sprite 空间的唯一方法是完整存储第一个 Sprite ,然后存储每个 Sprite 的原点和尺寸,就像动画 GIF 和 APNG 中所做的那样(动画 PNG -> https://en.wikipedia.org/wiki/APNG )
关于c - Sprite Packing C 应用程序中的 Sprite 对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58963373/