接着上一篇文章,还是解决OiteBoys写的flappy Bird游戏(https://github.com/OiteBoys/Earlybird)的问题。
OiteBoys已经将他的游戏更新到支持3.1版本了。但是除了文件搜索路径、碰撞检测的Bitmask和游戏结束时Bird的旋转角这些需要修改之外,3.1版本上编译出来的游戏跟3.0beta2上编译出来的游戏有个很明显不一样的地方,那就是3.1版本上的游戏在第二次游戏(第一次游戏结束后点开始按钮后开始的一盘)以及后面所有的游戏结束后,Bird一碰到地面或水管,马上就消失了而不是像第一盘那样渐渐的消失。带给人的感觉有点突兀,似乎是哪里有bug一样。如果把游戏强制退出又重新打开,第一盘的Bird总是会在游戏结束时渐渐消失。
但是如果只是对比两个版本的游戏逻辑部分的代码,是看不出哪里有问题的。我也是看了很久才找到问题的所在:cocos2d-x 3.0beta2和3.1在FadeOut的实现上是不同的!
这里需要理解opacity的概念。Node里面有_realOpacity和_displayOpacity的概念,_displayOpacity涉及到父节点影响到子节点的opacity。关于这两个opacity的详细解释可以参见这篇文章:http://blog.csdn.net/mdifferent/article/details/39736953
对于当前这个例子,我们这里只需要了解_realOpacity的概念就行了,其实就是Node的透明度。下面说的opacity都指的是_realOpacity。opacity = 1表示完全不透明,opacity = 0表示完全透明。
在3.0 beta2里面FadeOut的update是这样的:
void FadeOut::update(float time) { if (_target) { _target->setOpacity(GLubyte(255 * (1 - time))); } /*_target->setOpacity(GLubyte(255 * (1 - time)));*/ }
当第一盘游戏结束结束时,Bird的opacitty渐渐的变为了0。第二盘结束时虽然Bird的opacity没有被重置为255,但是注意上面FadeOut::update的实现,跟此时Bird的opacity无关!只跟逝去的时间相关。于是尽管Bird的opacity为0,但第一次调用FadeOut::update也会导致他为一个正数(第一次调用一般是255)!于是BIrd的渐变又出现了。
在3.1版本里面FadeOut是没有update函数的,它的update借助于FadeTo实现:
void FadeTo::update(float time) { if (_target) { _target->setOpacity((GLubyte)(_fromOpacity + (_toOpacity - _fromOpacity) * time)); } /*_target->setOpacity((GLubyte)(_fromOpacity + (_toOpacity - _fromOpacity) * time));*/ }
可以看到这里除了跟逝去的时间相关,还与target(这里是Bird)的opacity相关。所以第一盘游戏结束后Bird的opacity变为了0,第二盘游戏结束时Bird的opacity会影响到渐变的表现,Bird没有出现渐变,而是直接看不见了!
解决3.1版本代码的问题其实很简单,就是在每次游戏开始的时候都重置一下sprite的opacity就好了:
this->bird->setOpacity(255);原文链接:/cocos2dx/347137.html