SDL中文论坛

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

[animation] 移动动画细节

[复制链接]

21

主题

36

帖子

334

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
334
跳转到指定楼层
楼主
发表于 2020-9-3 18:22:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、x_offset、y_offset和200毫秒
即使在一格子,为表现出具体移动,部队的偏移要从“0~1”。这个offset_x/offset_y在图像上表现出是部队从a格子中心到b格子中心,而不是从a格子离b格子的最“后”位置到离b格子的最“前”位置。

200毫秒是什么?200毫秒是韦诺源码定义的部队在这一时间内必须从“0~1”!这硬定义的200毫秒使得动画周期也应该为200毫秒!由于程序在判断动画时间上“抖动”,如果依旧是用要显示完移动动画,可能会超过200毫秒,可一旦超过200毫秒,部队将又挪动到“0”处,出错了!为避开抖动,韦诺源码判断动画结束用“animator.wait_until(target_time)”而不是“animator.wait_for_end()”。

为能让外部灵活定义移动动画周期,我去掉了200毫秒,改为外部定义移动动画时必须自主定义出x_offset、y_offset(要没意外两个值在整动画过程固定为“0~1”)。

为支持去掉200毫秒,程序做了相关两处修改。
  • unit_animation.cpp中的BOOST_FOREACH (const animation_branch &ab, prepare_animation(cfg, "movement_anim"))注释掉自动添加offset_x/offset_y;
  • move_unit_between中的判断动画结束用“animator.wait_for_end()”而不是“animator.wait_until(target_time)”。

二、unit::pack_base_loc
unit::pack_base_loc是个map_location,当该map_location有效时,unit是用它来判断是否可以进入打包兵种,而不是部队所在的loc。

为什么要引入unit::pack_base_loc?这是因为offset配置为“0~1”时,图像上表现出是部队从a格子中心到b格子中心,而不是从a格子离b格子的最“后”位置到离b格子的最“前”位置。这种结果使得部队从陆地进入深水时显示是陆地时部队形象以及移动声音,而为了“正确”,此时最好是显示深水水军形象及声音。

为理解这个“正确”,考虑这么个例子,移动只是从a到b,a是陆地b是深水,这要“正确”的话移动出来的声音应该是进入深水声音。同样的,如果a是深水b是陆地,那此次移动出来的应该是陆地声音。

移动时,让下一格子b成为部队的判断打包格子(而不是部队所在的a格子),相应地把它设为unit::pack_base_loc,这可以让“正确”显示移动。

部队打包和不打包影响很大,修改这个判断格子会不会造成副作用。由于在移动时使用的是一个临时部队对象,这对象作用就是为显示移动,不做其它用途。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-2 04:04 , Processed in 0.049019 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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