c - Sprite Packing C 应用程序中的 Sprite 对齐

标签 c animation sprite bmp sprite-sheet

我正在创建“完美”的 Sprite 打包程序。这是一个 Sprite 打包程序,可确保输出 Sprite 与大多数(如果不是全部)游戏引擎和动画软件兼容。它是一个将图像合并到水平 Sprite 表中的程序。

  1. 它将源帧转换(如果需要)到内存中的 BMP

  2. 它认为整个图像的左上角像素完全透明(可以配置)

  3. 它单独解析每个帧以找到真实的坐标矩形(实际帧开始、结束的位置、其宽度和高度(有时图像可能有很多额外的透明像素)。

    <
  4. 它确定框架框,其具有最大宽度/高度的框架的宽度和高度,以便它足够长以包含每个框架。 (为了获得额外的兼容性,每个框架必须具有相同的尺寸)。

  5. 创建宽度为 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/

相关文章:

将字符串转换为 C 中的 double 变量

c - 大多数程序都可以运行,但我的数组没有按应有的方式打印

c - 使用gcc编译C源代码时的问号

objective-c - Spritekit 操纵杆

javascript - 如何在 javascript 中减慢 spritesheet 动画的速度?

javascript - 使用 ScrollMagic 同步 Sprite 和滚动

css - 单击动画 Sprite 时触发鼠标离开

c - C 中的 LRU 缓存设计,大小有限

cocoa touch : animate button on touch

android - AndEngine 动画 Sprite 在视差背景帮助! :)