cocos2d-x中的opacity与Fade out
来源:互联网 发布:k歌软件电视 编辑:程序博客网 时间:2024/04/30 20:44
接着上一篇文章,还是解决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);
- cocos2d-x中的opacity与Fade out
- android 屏幕保护程序--------Fade In 与 Fade Out 特效与运行线程
- 四.cocos2d-x中的动画与动作
- cocos2d与cocos2d-X中的draw和update
- iOS: subview fade in and out
- cocos2dx之背景Fade in/out
- fade
- fade
- cocos2d-x中的随机数
- Cocos2d-x 中的字体
- cocos2d-x中的随机数
- cocos2d-x中的CCArray
- cocos2d-x 中的 CCSprite
- cocos2d-x中的CCArray
- cocos2d-x 中的CCTileMap
- Cocos2d-x中的字符串
- cocos2d-x中的坐标系
- cocos2d-x中的坐标系
- 一个Sqrt函数引发的血案——神奇的代码
- Python计算机视觉编程 笔记
- 提高程序员职场价值的10大技巧
- C++中static的用法总结
- OSPF和IS-IS详解 笔记
- cocos2d-x中的opacity与Fade out
- 表达式求值
- 通向实在之路:宇宙法则的完全指南 笔记
- PHP开发规范【总结】
- UVA 10047.The Monocycle(广搜)
- c语言的联合体以及大小端 (备忘)
- 如何在大学里成为IT技术大神
- ubuntu14.04分辨率设置
- cvReleaseImage()出错的问题