[animation] 实现关卡外动画

理论上播放动画图像分三步骤:存储背景、画图像、恢复背景。但是考虑到两个原因,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)。

 

设定基于窗口动画步骤

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

 

全部评论: 0

    写评论: