理论上播放动画图像分三步骤:存储背景、画图像、恢复背景。但是考虑到两个原因,1)按实现动画的程序辑逻,要用map_location分割动画涉及到的背景,在关卡外那得人为造出一个gamemap,非常麻烦;2)相对来说,关卡外是不大耗CPU地方,即使叫强制次次全刷,估且可以接受。因而在播放关卡外动画时采用省略了存储背景的简化形式。
[list=1]
[*]窗口画向framebuffer。
[*]动画画向framebuffer(game_display::draw_outer_anim)。
[*]flip。
[*]清空framebuffer、置窗口脏标志,使得1)时肯定会重画整窗口。
[*]-------------------->1)。
[/list]
按垂直放置到层分,关卡外动画分背景动画、前景动画。
描述 | 渲染时机 | |
背景动画 | 它们高于窗口背景,但低于除背景外部分。适用于像标题屏幕。 | twindow::draw画完背景后(注1) |
前景动画 | 它们高于窗口。 | thandler::draw在flip前(注2) |
- 注1。这种放置只能说是临时凑合用,目前不想考虑太多。标幕屏幕(title_screen)背景图像是在背景,实现它至少没问题。
- 注2。thandler::draw是gui2渲染的入口点、结束点。flip前放置可让确保会高于窗口各控件。
按基于的窗口,关卡外动画分为基于屏幕动画和基于窗口动画。
- 基于屏幕动画:offset_x/offset_y是基于游戏屏幕计算的动画。
- 基于窗口动画:offset_x/offset_y是基于某个窗口计算的动画。
在动画配置上,没有字段用于区分一个动画是基于屏幕还是基于窗口,这个区别是按使用场合定义。像序幕中的地图窗口是基于屏幕,那么在具体化这动画时就尊循基于窗口动画的参数规则。
基于屏幕动画 | 基于窗口动画 | |
offset_x/y基于尺寸 | 游戏当前屏幕 | 特别指定的窗口 |
和缩放无关偏移(注1) | (0, 0) | 窗口对应控件左上角 |
如何指定图像位置 | x/y、offset_x/y共同指定图像中心 | x/y、offset_x/y共同指定图像中心 |
注1。和缩放系数无关的偏移值。对动画来说,它以这个偏移值被整体偏移。因为不需要缩放,所以它是“最终”用户看到的某控件偏移值。

图中动画所在控件是地图控件,它的和缩放无关偏移就是该控件在屏幕中编移:(240, 35)。
设定基于窗口动画步骤
- 程序会告知该动画基于的窗口尺寸。像序幕动画是800x600。
- 基于800x600,MOD制作者设置好各动画参数。像旗帜、地名。
- 程序要播放时,它计算两参数,1)根据控件(对应窗口)尺寸和理论尺寸(800x600)计算出缩放系数zoom;2)根据控件左上角坐标计算和缩放无关偏移。