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

问题描述 投票:0回答:1

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

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

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

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

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

  5. 创建宽度为nFrames * wFrameBox的输出精灵

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

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位置的正确方法是什么?

c animation sprite bmp sprite-sheet
1个回答
0
投票
您应使用原始边界框的中心作为原点,然后找出每个子画面的大小,并跟踪最左边,最右边,最上面和最下面的非透明像素。这将为您提供避免抖动所需的边界框。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.