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

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

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

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

  3. 它分别解析每个帧以找到实际坐标rect(实际帧的开始,结束,其宽度和高度(有时图像可能会有很多额外的透明像素)。

  4. 它确定框架框,该框架框的宽度和高度具有最大的宽度/高度,以至于足以容纳每个框架。 (为获得额外的兼容性,每个框架必须具有相同的尺寸)。

  5. 创建宽度为nFrames * wFrameBox

  6. 的输出精灵

问题是-锚定对齐。当前,它尝试对齐每个框架,以使其中心位于框架框的中心。

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); 它还给出了更好的结果,表明这仍然不是正确的算法。 老实说,我不知道我在做什么。

如果输出的精灵表的宽度等于帧数乘以最宽的帧的宽度,那么对齐精灵帧的正确方法是什么(获得适当的x位置绘制下一个帧)?

p416769127 回答:Sprite Packing C应用程序中的Sprite对齐

您的问题是,您首先计算中心,然后计算所需边界框的大小。这就是您的图片“摇动”的原因,因为在每张图片中,中心都不同于原始中心。

您应该使用原始边界框的中心作为原点,然后找出每个子画面的大小,并跟踪最左边,最右边,最上面和最下面的非透明像素。这样可以为您提供避免抖动所需的边界框。

问题是您会发现大多数精灵已经完成了这种工作,因此实际上将原始边界框定义为绘制覆盖这些非透明像素的整个精灵序列的最小空间。

删除未使用的Sprite空间的唯一方法是先存储第一个Sprite,然后再存储其他Sprite的原点和尺寸,就像在动画GIF和APNG中一样(Animated PNG-> https://en.wikipedia.org/wiki/APNG

本文链接:https://www.f2er.com/3062448.html

大家都在问