ocos2d-x游戏实例之忍者飞镖——添加其他元素

距离上次写这个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);
}

本教程地址:http://www.zaojiahua.com/ninja-darts-2.html皂荚花,请到原文查看。



你可能感兴趣的:(cocos2d-x,cocos2d-x,游戏,android平台,android开发,忍者飞镖)