这几天使用cocos2d-x自己做个小游戏,在使用过程中遇到不少问题,在这里记录下来,做个总结,也希望对遇到相同问题的朋友有所帮助。
昨天下午开始使用CocosBuilder做场景,并在代码中绑定场景对象和菜单事件、成员变量。在网上查了下相关资料感觉还是挺容易的。结果在实际操作中总是问题不断,连续奋斗了十几个小时才把问题搞定。总结下遇到的问题:
- cocos2d-x与 cocosbuilder 版本问题
使用cocosbuilder 3.0(以后简称ccb)兴高彩列的制作了一个CCLayer场景,在cocos2d-x中加载出来,在CCBReader::readNodeGraphFromFile()提示:
“WARNING! Incompatible ccbi file version (file: 4 reader: 5)”
google + baidu 一翻都没找到好的解决办法, 有人说使用最新版本的ccb就是了,可www.cocosbuilder.com使终打不开,在网上搜索到的ccb 都是3.0 或3.0 Alpha,此路又不通,到底是什么问题总要搞清楚于是跟进源代码想看个究竟,找到代码:
![](https://img-blog.csdn.net/20130528220910086)
代码中 kCCBVersion定义为#define kCCBVersion 5 而文件头读出的版本号为4.
意思很明显了,CCBReader解析类与ccbi文件版本不合。
问题是知道了,但怎么解决呢?又找不到最新的ccb。 在之前搜索过程中找到了ccb在github上的源码,使用源码自己编译一个不就行了!
不知道是怎么会事,github非常的缓慢,中间还断过几次,就这样折腾到十二点过了,连源码都有没下载完,为了身体还是睡觉去了!
一晚都没睡好,早上五点过就醒了,天已经亮了。继续尝试check out代码,这下来劲了下载有200kb/s. 除了下载ccb源码外还需要cocos2d(Object-c)的lib,总共下载了近一个小时,具体有大数据记不得了,我在目录里编译了ccb产生了此垃圾代码,和输出文件一共有900M多。
下面就是我编译出的ccb 版本是未知
![](https://img-blog.csdn.net/20130528220945772)
经过这么大费周折终于把 “WARNING! Incompatible ccbi file version (file: 4 reader: 5)”问题搞定。
2.资源文件加载失败
正在高兴之际,累计时间还不到三分钟,在加载过程中又遇到问题:
”Get data from file(xxx/yyy.png)faild!”
这是在加载我在场景编辑器中的一个图片文件,怎么会不存在呢?我立马又使用了ccb工程中默认的MainScene.ccbi文件却没有问题,根据提示应该是文件找不到。检查图片资源是存在的,又反复重新添加问题还是存在。又祭出google, 线索是:a.使用全路径 ,我晕,我使用的是ccbi文件又无控制,再说使用全路径这个方法太烂,重新编译路径都会变的。b.将图片资源文件全部放到Resources目录上,之前我是放在Resources/ccbResources的, 这个方法可行,但觉得还是不好。只要又钻到源码里面去看发现:
MainScene中的png文件在文件路径解析上会解析出全路径,而我自己做的ccbi文件中的路径解析不出来,一路到头都是xxx/yyy.png 最后直到fopen()时就挂了。问题主要是在解析文件路径时无法搜索到xxx/yyy.png文件,Resources根目录下的文件可以解析到。
在ccb和xcode中反复又折腾了一个多小时,还是没戏。又在网上找教程再仔细看看,忽然眼前一亮:
![](https://img-blog.csdn.net/20130528221013714)
将Flatten paths when publishing 复选框勾上,OK问题搞定了!我场景终于出来了!
3. 普通屏幕与Retina屏幕的适配问题
我直接使用的是Retina屏尺寸的png文件 960*640的文件,策略是在普通屏幕下将图片缩放为0.5, 按ccb默认添加文件时缩放为1.0 iPhone Landscape方式 我在编辑器中将所有图片缩放到了0.5,结果在高清模拟器中显示惨不忍睹。后来设置如下方式:
在普通屏幕缩放0.5 , 在新建一个屏幕解决方案,手动设置宽960,高640。缩放为1.0
![](https://img-blog.csdn.net/20130528221100223)
并且还需要在代码设置:
![](https://img-blog.csdn.net/20130528221124238)
至此在不同屏幕上的问题解决了。
4. 事件函数和类成员绑定出问题
现在界面也对了,该为我的场景界面添加事件响应了,我按照教程中讲的实现了
CCBSelectorResolver中的虚函数,在ccb中为控件设置了Selector名字,方法也很简单,可是不幸的事又发生了,我重写的onResolveCCBCCMenuItemSelector、onResolveCCBCCControlSelector 函数都没响应,代码根本没走过来。
除了源码,还是源码只有在源码中找解决办法。 搜索了CCBSelectorResolver类在代码中的什么地方出现(这里吐槽一下xcode搜索怎么一点都不好用,经常搜不出东西来。)
![](https://img-blog.csdn.net/20130528221145519)
只有在源代码中肉眼搜索,终于被我发现:
在”if(!pCCBReader->isJSControlled())“这句代码中退出了,从表面上看应该是与javascript绑定相关的呀,回想一下ccb在最开始就发现有些地方和网上教程中的不一样。在我的ccb上Code connections是这样的:
![](https://img-blog.csdn.net/20130528221412036)
但一般应该是这样的:
![](https://img-blog.csdn.net/20130528221439591)
在ccb上菜单挨个找,挨个试让我发现一个开关:
![](https://img-blog.csdn.net/20130528221534574)
把这个勾去掉,由原来JS controller变成Custom class。再次生成发布
事件响应来了!。
终于问题搞定,我的场景显示出来了,事件响应也能触发。这一天就被cocos2d-x 和ccb给折腾了。