《梦幻连连看》源代码来自原作者kuloveyouwei,他的版本是cocos2d-x 2.1.2,
他在博客中详细解读了源代码,其博客地址http:// blog.csdn.net/kuloveyouwei/article/details/12912875
源代码和素材下载地址http:// download.csdn.net/detail/kuloveyouwei/7158157
下面我们要示范的是如何把cocos2d-x不同版本代码移植,
本案例是从cocos2d-x 2.1.2+mac环境到cocos2d-x-2.2.2+VS2010。
1、创建工程。用VS2010打开编译运行,使得HelloWorld界面正常显示。
2、下载本游戏所需的资源,将下载的images和Sounds文件夹资源放置新建项目的"Resources"目录下。
3、把下载的Resources文件夹的资源放置到新建项目的"Resources"目录下。
4、把下载的Classes里(除了AppDelegate的.h和.cpp外)的.cpp和.h、.pch文件放置到新建项目的Classes目录下。
5、把下载的Classes里的《levelinfo.plist》文件放置到新建项目的"Resources"目录下。
6、右键——添加——现有项目,把我们项目的Classes目录下的.cpp和.h、.pch文件都添加进去。
7、代码调整:
关于Unicode 格式
编译运行后,提示很多这个warning:
该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。
之前忽视了warning,后来才发现这个是大问题,因为会影响到回车符。
以前在LINUX或其他的跨平台下写的,拷到VS2010后常常会提示如此,这是因为不同平台的换行符所造成的。VS中有unicode字符 ,打开后再保存, vs会自动保存为unicode格式.但有时unicode字符后的"未正确识别导致字符串不能结束,unicode字符后的换行未正确识别导致//后的注释不能正常结束。
但问题怎么解决呢?我再才找到源文件,复制了一份,全部一一保存为Unicode 格式。操作方法如下:在VS打开该文件前,先用电脑中记事本打开,然后文件--另存为,在弹出的对话框的下页的编码中选择unicode编码和保存类型为所有文件即可。(风险:交叉编译到安卓的时候,gcc的编译器可能会不认识Unicode 格式,如果可以的话,先尝试找1 2个把格式另存为ANSI看看能否成功。)
修改好后复制到项目的class目录并覆盖掉原来的问题,记得不用复制AppDelegate的.h和.cpp。(此外,我备份了一个,以防后续要用)
关于随机函数和随机种子
错误提示:srandom 找不到标识符,
原因是库函数中没有srandom()、random(), 只有srand()跟rand()函数
把srandom()用srand()函数代替就没有这个错误了。
报错提示:helloworldscene.cpp(403): error C2660: “srand”: 函数不接受 0 个参数
我们通过srand((unsigned)time(NULL));或者srand(int(time(0)));种子函数解决,即要求一个无符号的整形参数置随机数生成器的启动值
报错地方一:
int times=arc4random()%5+1;改为
srand((unsigned)time(NULL));
int times=rand()%5+1;
报错地方二:
float yoffset=arc4random()%40+1; 改为:
srand((unsigned)time(NULL));
float yoffset=rand()%40+1;
关于函数参数
报错提示:“类型转换”: 无法从“void (__thiscall PauseLayer::* )(void)”转换为“cocos2d::SEL_MenuHandler”
参考资料1:http:// blog.csdn.net/xuzhuang2008/article/details/9280889
参考资料2:http:// my.eoe.cn/599048/archive/24801.html
解决方法如下:
我们先从容易理解的开始。
例如这句this->scheduleOnce(schedule_selector(GameLayer::playSound1), 65);
找到 .cpp文件中找到void GameLayer::playSound1()函数进行修改为void GameLayer::playSound1(float dt)
.h文件中找到void playSound1(void);修改为 void playSound1(float dt);
例如this->scheduleOnce(schedule_selector(GameLayer::playSound2), 60);
找到 .cpp文件中找到void GameLayer::playSound2()函数进行修改为void GameLayer::playSound2(float dt)
.h文件中找到void playSound2(void);修改为 void playSound2(float dt);
例如这句this->scheduleOnce(schedule_selector(GameLayer::playSound3), 62);
找到 .cpp文件中找到void GameLayer::playSound3()函数进行修改为void GameLayer::playSound3(float dt)
.h文件中找到void playSound3(void);修改为 void playSound3(float dt);
同理修改以下各行,找到对应的函数修改参数为(float dt)
this->schedule(schedule_selector(HelloWorld::wavesAnimation), 10);
this->schedule(sche