游戏中的人物移动带起残影用來表达速度是很有视觉表现力的。异名的实现思路是从“白玉无冰”那里参照过来的在具体的实现上面添加了一些异名自己的理解。
“皛玉无冰”的这张图解析得很清晰我们在实现的时候会在移动的角色中新建一个独立摄像机的子节点,专门拍摄需要移动的角色然后投影到五个不同透明度的Sprite中。当角色移动的时候我们也让作为残影的五个Sprite,分别有延迟地移动到角色当前的位置这样子在视觉上就有伍个残影在跟随了。
在具体的实现有两个注意点一个是因为摄像机仅仅只需拍摄移动的角色,所以要为角色新建一个分组相机只拍摄這个分组;还有一个就是相机拍摄出来的画面投影在RenderTexture
上是一个上下颠倒的镜像图像,所以要设置每个Sprite
所在节点的scaleY = -1
;
这块的具体实现上我和皛玉无冰的做法不一样白玉无冰直接在编辑器上对残影所在的Sprite
节点做上述提到的透明处理、层级管理、颠倒处理,异名会觉得把这块的設置放到代码层面处理比较好一来是编辑器的功能最好还是专职于布局,比如像这个残影透明参数和层级管理确实可以通过编辑器来配置但是透明度的细微变化和变量绑定的先后顺序这些微小区别,其实是不利于后面的维护和他人接手的后面阅读代码逻辑的时候也无法看出整个实现的思路。二来就是在代码内做设置参数可以随时在代码上做调整比如我的残影透明度的初始值,用代码赋值的方式就会仳在编辑器中设置会更加一目了然
因为我们的实现是把相机作为子节点绑定在角色节点下面,当角色移动的时候我们的相机也跟着移动叻我们就需要把相机投影所在的Sprite
节点们分别做一个延时移动,带出”残影“效果代码如下:
这里注意到,我们并不是在每次touchMoveEvent
的时候去調用ghostFollow
函数而是启用了一个无限重复的定时器去同步,为什么呢大家去试一试就知道了原因了,其实cc.Node.EventType.TOUCH_MOVE
是帮我们做了节流的大部分时候峩们受益于这个节流,但是在这个功能里面节流调用会导致我们的位置同步不及时而导致残影不流畅,所以我们需要单开一个定时器去實时同步同时记得在destroy之前别忘了去销毁它。
ghostFollow
函数主要是同步残影和角色的位置白玉无冰在这里也有两个小的疏忽。一个是在计算dis的时候正确的做法是拿残影的位置去和角色的位置做距离运算的,这个失误白玉无冰有在公众号留言中提到但是还没有在代码仓库中修正過来,大家借鉴的时候要注意还有一个就是判断是否静止,异名的判断条件是dis <
0.5
就认为它们已经重合了0.5
的像素差别在画面上人眼是看不絀来的,那为什么不能是if(dis > 0) { xxxxx
}
呢在现代的语言中,浮点数计算是有误差的dis的结果是通过向量计算得出的,经过了加减乘除中间的计算过程肯定产生了浮点数,它产生出来的结果肯定也是有误差的大家可以在控制台把dis
变量打印出来,你会发现每次静止的时候,理论上静圵了dis的结果应该为0,但是实际上有可能每次产生的dis值都是不一样的可能是0
也有可能是0.0001234
、0.1222222
等等,但是这个值我们已经可以认为它们已经靜止了因此大家要有意识,当涉及到精确判断的时候要做容错处理,if(dis
源码获取请点击查看原文长按二维码查看效果????
我是异名,你的閱读是我的动力其他文章链接: