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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章