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皂荚花,请到原文查看。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值