精灵动画

精灵引擎

Qt Quick 精灵引擎是一个结合了分割包含多个动画帧的图片能力的随机状态机。

状态机

精灵引擎的主要功能是其内部状态机。这与 Qt Quick 中的状态和转换不同,更像是一个传统状态机。精灵可以与其他精灵或它自身具有加权的转换。当精灵动画结束时,精灵引擎将根据刚刚完成的精灵可用的加权转换随机选择下一个精灵。

你可以以两种方式影响正在播放的精灵。你可以随意强迫它立即开始播放任何精灵,或者你可以告诉它逐渐过渡到一个指定的精灵。如果你指示它逐渐过渡,那么它将通过使用最少数量的中间精灵通过有效的状态转换进入目标精灵(但忽略相对权重)。这使得你能够轻松地在两个不同的精灵之间插入过渡动画。

例如,考虑上述图表,它说明了假设的 2D 平台游戏角色的精灵。角色最初显示 站立 状态。从该状态开始,如果没有外部输入,他将转换到 等待 动画、行走 动画,或者再次播放 站立 动画。因为那些转换的权重分别为一、零和三,当他完成 站立 动画时,播放 等待 动画的机会是四分之一,再次播放 站立 动画的机会是四分之三。这允许角色在等待时有一个略微动画化和可变的行为。

因为有一个权重为零的转换到 行走 动画,站立 动画通常不会过渡到那里。但如果你将目标动画设置为 行走 动画,它在完成 站立 动画后会播放 行走 动画。如果它之前处于 等待 动画中,它将完成播放该动画,然后播放 站立 动画,然后播放 行走 动画。然后它会继续播放 行走 动画,直到目标动画被重置,那时它会完成 行走 动画后切换到 站立 动画。

如果您将目标状态设置为跳跃动画,则它将先完成行走动画后再播放跳跃动画。因为跳跃动画不转换到其他状态,所以它会继续播放跳跃动画,直到状态被强制更改。在这个例子中,您可以将其还原为行走,并将目标动画更改为行走或设置为无(这将导致在行走动画之后播放站立动画)。注意,通过强制设置动画,您可以立即开始播放动画。

输入格式

精灵引擎接受的文件格式与其他QML类型接受的文件格式相同,例如图像。然而,为了动画化图像,精灵引擎要求图像文件包含动画的所有帧。这些帧应该按顺序排列,可能从文件的右边缘开始回绕到从文件左边缘开始的下一行(直接位于上一行下方)。

例如,看上面的图像。现在,只需考虑黑色数字,并假设正方形是40x40像素。通常,图像从左上角开始读入。如果您指定帧大小为40x40像素,并且帧数是8,那么它会按照数字顺序读入帧。左上角的帧是第一帧,右上角的帧是第五帧,然后它会从文件的像素位置0,40回绕到下一行。它会在标记8的帧后停止读取,如果四帧以下的方形中有图像数据,则该图像数据将不包括在动画中。

虽然可以从任意偏移加载动画,但它们仍然会遵循相同的模式。现在考虑红色数字。如果我们指定动画从像素位置120,0开始,帧数为5,且与前相同的帧大小,那么它将按照红色数字的顺序加载帧。图像的第一120x40部分不会被使用,因为它从120,0的位置开始读取40x40的块。当它到达文件末尾在160,0时,它然后从0,40开始读取下一排。

蓝色数字显示在从40,40开始尝试加载相同大小的两个帧时的帧编号。请注意,您可以从一个图像文件中加载多个精灵。红色、蓝色和黑色数字都可以作为单独的动画加载到同一个精灵引擎中。以下代码根据图像加载动画。它还指定动画将以每秒20帧的速度播放。

Sprite {
    name: "black"
    source: "image.png"
    frameCount: 8
    frameWidth: 40
    frameHeight: 40
    frameRate: 20
}
Sprite {
    name: "red"
    source: "image.png"
    frameX: 120
    frameCount: 5
    frameWidth: 40
    frameHeight: 40
    frameRate: 20
}
Sprite {
    name: "blue"
    source: "image.png"
    frameX: 40
    frameX: 40
    frameCount: 2
    frameWidth: 40
    frameHeight: 40
    frameRate: 20
}

一个动画中的帧必须大小相同。但是,同一文件中的多个动画则不需要。没有指定帧数的精灵假设它们占据整个文件,并且您必须指定帧大小。没有指定帧大小的精灵假设它们是正方形,并占据整个文件而不回绕,您必须指定帧数。

精灵引擎在内部复制并分割图像以适应易于阅读的内部格式,这导致了一些图形内存限制。因为它需要单个引擎中的所有精灵都在同一纹理中,因此尝试加载许多不同的动画可能会在嵌入式设备上遇到纹理内存限制的问题。在这些情况下,将输出包含最大纹理大小的警告到控制台。

有一些工具可以将一系列图像转换为精灵表。以下是几个示例:

使用精灵引擎的 QML 类型

可以使用 Sprite 类型定义用于精灵引擎的精灵。此类包括输入参数、动画长度和过渡到其他动画的权重。这纯粹是一个数据类,不渲染任何内容。

SpriteSequence 是一个使用精灵引擎绘制其中定义的精灵的类型。它是一个单一且自包含的精灵引擎,不与其他精灵引擎交互。可以在使用精灵引擎的类型之间共享 Sprite 类型,但这不是自动完成的。因此,如果您在一个 SpriteSequence 中定义了一个精灵,您将需要在另一个 SpriteSequence 的精灵属性中重新定义它(或引用相同的 Sprite 类型),以便过渡到该动画。

此外,ImageParticle 可以使用 Sprite 类型来为每个粒子定义精灵。这也是每个类型一个精灵引擎。它与 SpriteSequence 具有类似的工作方式,但它也具有由 ImageParticle 类型提供的参数化可变性。

AnimatedSprite 类型

对于不需要在动画之间切换的场景,请考虑使用 AnimatedSprite 类型。此类使用相同的输入格式显示精灵动画,但一次只显示一个。它还提供了更细致的手动控制,因为没有精灵引擎在幕后管理时间和过渡。

© 2024 Qt 公司。此处包含的文档贡献是各自拥有者的版权。此处提供的文档在自由软件基金会的 GNU 自由文档许可证版本 1.3 方面获得许可。Qt 及其相应标志是芬兰及/或其他国家的 Qt 公司的商标。所有其他商标均为各自拥有者的财产。