cocos2d-x中的opacity与Fade out

接着上一篇文章,还是解决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);

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...