距离上次写这个demo已经快俩个礼拜了,其实这段时间我也一直在做这个例子,为这个小例子加入UI,声音,对中文的支持,用户数据的保存,做移植,做适配,直到今天才把所有的东西都解决了,并且已经在我手机上跑了起来,自己也看到了效果。今天写完这篇博客,我的基础就差不多了,可以进一步学习了,真是高兴啊,没想到自己解决了这么多的问题!现在就把这几天的成果都展现出来吧。 1、我们首先引入对中文的支持,在我的前几篇博客中我有记录了整个过程,不明白的可以先点击上一段的链接,我们先来把我们将要用到的筛选器都建立好,如下图所示,大家对照着上一篇文章新增一些筛选器就可以了。
建立字符转化的头文件和cpp文件,然后写入以下的代码,代码的含义注释写的很清楚了,这里就不罗嗦了。
#ifndef _GBKTOUTF8_H_ #define _GBKTOUTF8_H_ #include "cocos2d.h" //包含这个头文件,iconv库是一个字符集转换的开源的库,cocos2dx支持的编码是UTF-8, //在win32下使用的编码是GB2312,所以要转化一下,才能显示中文 #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) #include "iconv\iconv.h" #else #include "../../../../libiconv/include/iconv.h" #endif //#include "../../../../libiconv/include/iconv.h" //记住附加依赖项libiconv.lib或者使用以下的代码 //#pragma comment(lib, "libiconv.lib") //就是一个函数没有分装成类 int GBKToUTF8(std::string & gbkStr, const char* toCode, const char* fromCode); #endif
#include "GBKToUTF8.h" //以下函数是从网上copy的,试了一下可以解决问题 int GBKToUTF8(std::string & gbkStr, const char* fromCode, const char* toCode) { iconv_t iconvH; //这个函数调用的作用是将formCode的编码转换成toCode的编码,我们一般调用的时候是GB2312 UTF-8 //因为系统又的编码支持有的不支持所以就有可能返回0 iconvH = iconv_open(toCode,fromCode); //如果返回值为0代表不可以转化 if (iconvH == 0) { return -1; } //将string类型转化为char *类型 const char* strChar = gbkStr.c_str(); //以下是基础不说了 const char** pin = &strChar; size_t strLength = gbkStr.length(); char* outbuf = (char*) malloc(strLength*4); char* pBuff = outbuf; //这里GB2312和UTF-8的位数是1:4不明白,知道的人说一下 memset(outbuf, 0, strLength*4); size_t outLength = strLength*4; //第二个参数表示转化前字符的地址,以后的参数分别是转化前字符的长度,转化后的存储地址,转化后的长度 if (-1 == iconv(iconvH, pin, &strLength, &outbuf, &outLength)) { free(pBuff); iconv_close(iconvH); return -1; } gbkStr = pBuff; iconv_close(iconvH); return 0; }
#ifndef _START_GAME_SCENE_H_ #define _START_GAME_SCENE_H_ #include "cocos2d.h" using namespace cocos2d; //这几个场景类都是继承自CCLayer,和原来的例子HelloWorld的写法差不多,大家仿照原来的搭建基本的代码就行 class StartGameScene : public CCLayer { public: static CCScene * scene(); bool init(); CREATE_FUNC(StartGameScene); private: //考虑到这些方法都是在本类中自己调用,所以写成私有的 //这是开始游戏菜单触发的事件代码 void startMenu(CCObject * object); //这个是游戏设置菜单触发事件的代码 void setMenu(CCObject * object); //这个是关于我们游戏菜单的触发事件的代码 void aboutMenu(CCObject * object); //这个函数的作用是在开始游戏的这个场景上添加上述的一些菜单 void addMenu(); }; #endif
#include "StartGameScene.h" #include "GBKToUTF8.h" //字符的支持 #include "GameMainLayer.h" //游戏主场景 #include "SetMenuScene.h" //设置游戏场景 #include "AboutUs.h" //关于我们场景 CCScene * StartGameScene::scene() { CCScene * scene = NULL; do { scene = CCScene::create(); CC_BREAK_IF(!scene); StartGameScene * layer = StartGameScene::create(); CC_BREAK_IF(!layer); scene->addChild(layer); } while(0); return scene; } bool StartGameScene::init() { bool bRet = false; do { CC_BREAK_IF(!CCLayer::init()); CCSize size = CCDirector::sharedDirector()->getWinSize(); //添加背景图片 CCSprite * backgroundSprite = CCSprite::create("StartGame.png"); backgroundSprite->setPosition(ccp(size.width/2,size.height/2)); this->addChild(backgroundSprite); //添加显示在该场景上的一些菜单项 this->addMenu(); bRet = true; } while(0); return bRet; } void StartGameScene::startMenu(CCObject * object) { //菜单响应处理事件的实现,改变场景,我们使用的是replaceScene的方法,这个时候会释放掉当前的场景 //考虑到用户从游戏主界面中返回到这个场景可能需要很长的时间,当然要释放掉这个场景了,免得占用资源 CCDirector::sharedDirector()->replaceScene(GameMainLayer::scene()); } void StartGameScene::setMenu(CCObject * object) { //使用push将当前的场景入桟,以便继续运行原来的场景,用户设置完一些选项会回到这里,所以就不要先释放这个资源了 CCDirector::sharedDirector()->pushScene(SetMenuScene::scene()); } void StartGameScene::aboutMenu(CCObject * object) { //和上边的setMenu类似,它们都会通过popScene()的方式回到这个游戏开始的场景的 CCDirector::sharedDirector()->pushScene(AboutUs::scene()); } //添加显示在该场景上的一些菜单项 void StartGameScene::addMenu() { //设置菜单中显示的字符,并转换编码格式 std::string startString = "开始游戏"; GBKToUTF8(startString,"GB2312","UTF-8"); std::string setString = "游戏设置"; GBKToUTF8(setString,"GB2312","UTF-8"); std::string aboutString = "关于我们"; GBKToUTF8(aboutString,"GB2312","UTF-8"); //设置菜单项 CCMenuItemFont * item1 = CCMenuItemFont::create(startString.c_str(),this, menu_selector(StartGameScene::startMenu)); CCMenuItemFont * item2 = CCMenuItemFont::create(setString.c_str(),this, menu_selector(StartGameScene::setMenu)); CCMenuItemFont * item3 = CCMenuItemFont::create(aboutString.c_str(),this, menu_selector(StartGameScene::aboutMenu)); CCMenu * mainMenu = CCMenu::create(item1,item2,item3,NULL); //设置菜单项的竖直对齐方式,间隔25 mainMenu->alignItemsVerticallyWithPadding(25); //添加到场景中 this->addChild(mainMenu); }
ocos2d-x游戏实例之忍者飞镖——添加其他元素,布布扣,bubuko.com
原文:http://blog.csdn.net/huangsir2011/article/details/20646729