SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4089|回复: 0
打印 上一主题 下一主题

[Animation] 周期动画、does_not_change_变量

[复制链接]

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
跳转到指定楼层
楼主
发表于 2017-6-1 21:01:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ancientcc 于 2017-6-3 08:47 编辑

does_not_change_是画线中变量,它指示该画线是否只有一个图元,ture表示只有一个“图元”,否则不是。对于只有一个图元时,动画逻辑会对它简化处理。

  • 只有一个图元不等于只有一帧,像逐进变量就可能一帧导致多个图元,参考:frame_parsed_parameters::does_not_change();
  • 当用替换法代替了逐进变量时,须重新计算does_not_change_。参考:unit_animation::particular::replace_progressive(...);
  • 当是does_not_change_==true时,韦诺原代码有不能使之是周期动线BUG,须修改。
    1. <kingdom-src>/src/animated.i
    2. template<typename T,  typename T_void_value>

    3. void animated<T,T_void_value>::update_last_draw_time(double acceleration)
    4. {
    5.         ......
    6.         if (does_not_change_)
    7.                 return;
    8.         if (!started_) {
    9.                 return;
    10.         }
    11.         ......
    12. }
    13. 改为
    14. template<typename T,  typename T_void_value>
    15. void animated<T,T_void_value>::update_last_draw_time(double acceleration)
    16. {
    17.         ......
    18.         if (does_not_change_ && !cycles_)  // 增加必须!cycles_
    19.                 return;
    20.         if (!started_) {
    21.                 return;
    22.         }
    23.         ......
    24. }
    复制代码




对周期动画,所有画线必须在同一时刻开始播放下一周期!class animated中cycles_指示的是该画线需周期播放,如果画线只是按cycles=true和自已播放完了就开始下一周期,那对于多画线、各画线播放时间还不同的周期动画来说,从下一周期开始动画就乱了。为此,一画线判断是否要下播放进入下一周期不仅仅要看最后一帧播放完,它可能还须要等,直到外界告诉它所有画线都播放完了,即这一动画周期已结束。

外界如何额外告诉画线此动画所有画线播放完了,一种方法是修改update_last_draw_time,让增加个可启动下一周期参数;第二种方法是先用animation_finished_potential()判断,一旦判断出播放完了,调用start_animation让重启一次播放。

此个动画设的cycles_是false!
  1. void draw_canvas_anim(display& disp, int id, surface& canvas, const SDL_Rect& rect)
  2. {
  3.         ......
  4.         if (anim.animation_finished_potential()) {
  5.                 anim.start_animation(0, map_location::null_location, map_location::null_location, false);
  6.         } else {
  7.                 anim.update_last_draw_time();
  8.         }
  9.         ......
  10. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-2 02:39 , Processed in 0.057360 second(s), 19 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表