编辑:澄清我的问题是什么:这是处理内容创建/管理中游戏引擎中动画/动画状态的好方法吗?这样做的缺点是什么?将有替代方法吗?-尽管我的回答在评论中得到了部分回答,但这似乎是必经之路。
我正在尝试在2D游戏引擎爱好项目中处理动画,而无需对其进行硬编码。在我看来,硬编码动画状态似乎是一种常见但非常奇怪的现象。
一些背景知识:我正在使用一个实体系统,在该系统中组件是数据包,而子系统则对它们起作用。我选择使用轮询系统来更新动画状态。
对于动画状态,我的意思是:“ walking_left”,“ running_left”,“ walking_right”,“ shooting”,...
我处理动画的想法是将其设计为数据驱动模型。数据可以存储在xml文件,rdbms等文件中,也可以在游戏/关卡/开始时加载。通过这种方式,您可以轻松地编辑动画和转场,而不必在您的各处更改代码游戏。
作为示例,我制作了一个我想到的数据定义的xml草案。
一个非常重要的数据就是动画的描述。动画将具有唯一的ID(描述性名称)。它将保存图像的参考ID(它使用的Sprite表,因为不同的动画可能使用不同的Sprite表)。每秒运行动画的帧数。此处的“重播”定义了动画应运行一次还是无限次运行。然后,我将矩形列表定义为框架。
<animation id='WIZARD_WALK_LEFT'>
<image id='WIZARD_WALKING' />
<fps>50</fps>
<replay>true</replay>
<frames>
<rectangle>
<x>0</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
<rectangle>
<x>45</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
</frames>
</animation>
动画数据将被加载并保存在动画资源池中,并由使用它的游戏实体引用。它将被视为资源,例如图像,声音,纹理,...
要定义的第二个数据将是用于处理动画状态和过渡的状态机。这定义了游戏实体可以处于的每个状态,可以过渡到的状态以及触发状态改变的原因。
每个实体的状态机都不同。因为鸟类可能具有“行走”和“飞行”状态,而人类只有“行走”状态。但是它可以由不同的实体共享,因为多个人可能具有相同的状态(尤其是当您定义一些常见的NPC(例如怪物等)时)。另外,兽人的状态可能与人类相同。只是为了说明该状态定义可以共享,但只能由一组选定的游戏实体共享。
<state id='IDLE'>
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_LEFT'>
<event trigger='LEFT_UP' goto='IDLE' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_RIGHT'>
<event trigger='RIGHT_UP' goto='IDLE' />
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
</state>
这些状态可以由轮询系统处理。每个游戏滴答声都会捕获游戏实体的当前状态并检查所有触发器。如果满足条件,它将实体的状态更改为“ goto”状态。
我苦苦挣扎的最后一部分是如何将动画数据和动画状态绑定到实体。在我看来,最合乎逻辑的方法是为实体使用的状态机数据添加一个指针,并为该机中的每个状态定义其使用的动画。
这是一个xml示例,我将通过解决动画状态和动画数据ID来定义游戏中某些常见实体的动画行为和图形表示。请注意,“向导”和“兽人”都具有相同的动画状态,但是动画不同。同样,不同的动画可能意味着不同的精灵表,甚至意味着不同的动画序列(动画可能更长或更短)。
<entity name="wizard">
<state id="IDLE" animation="WIZARD_IDLE" />
<state id="MOVING_LEFT" animation="WIZARD_WALK_LEFT" />
</entity>
<entity name="orc">
<state id="IDLE" animation="ORC_IDLE" />
<state id="MOVING_LEFT" animation="ORC_WALK_LEFT" />
</entity>
创建实体时,它将添加状态列表以及状态机数据和动画数据引用。
将来,我将使用实体系统通过以类似的xml格式定义组件来构建整个实体。
-
经过研究,这就是我想出的。但是,我在解决问题时遇到了一些麻烦,因此希望获得一些反馈。这里有没有意义的东西吗,还是有更好的方法来处理这些事情?我掌握了遍历帧的想法,但是我很难将它进一步走了,这是我试图做到的。