您好,登錄后才能下訂單哦!
前言:
前面幾篇文章很基本的實(shí)驗(yàn)了一下塔防游戲的編寫(xiě),但試想一下一個(gè)塔防游戲,關(guān)卡中會(huì)有很多的信息,包括敵人的總波數(shù),敵人的種類,塔的限制種類等,于是我將這些信息寫(xiě)在一個(gè)plist文件中,當(dāng)然這個(gè)plist文件中不僅僅包括關(guān)卡的信息,還包括了一些需要提前加載的圖片地址,用一個(gè)loading的層提前加載這些圖片并裝進(jìn)內(nèi)存。
第一步:構(gòu)思
1.總體流程
首先我們構(gòu)思一下整體的流程,像這樣
這樣的思路就是,根據(jù)用戶選擇的關(guān)卡,比如,第一大關(guān)的第一小關(guān),關(guān)卡編號(hào)就是“1-1“,根據(jù)這個(gè)編號(hào)加上點(diǎn)字符串 就變成文件名,如:Level_01_01.plist,前面再加點(diǎn)路徑什么的就行了。
封裝成一個(gè)函數(shù)方便調(diào)用
const * char getLevelInfoPath(int numlevel01,int numlevel02) { CCString * pString = CCString ::createWithFormat("values/Level_%d_%d.plist",numlevel01,numlevel02); //獲得const *char return pString->getCString(); }
2.plist文件內(nèi)容
之后我們?cè)傧胂脒@個(gè)plist中需要包含什么信息,像預(yù)加載圖片地址,敵人總波數(shù),每波多少個(gè)敵人等
像這樣
3.plist文件編寫(xiě)
想好了plist文件中都有什么后就開(kāi)始編寫(xiě)plist文件了,先搜索一下電腦中的plist文件,找一個(gè)文件內(nèi)容比較少得復(fù)制黏貼一下,修改文件名并用xcode打開(kāi)文件,將我們自己的信息寫(xiě)進(jìn)去。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>levelparameter</key> <dict> <key>New item</key> <string></string> </dict> <key>needtoloadp_w_picpaths</key> <dict> <key>4</key> <string>loadingHMenu/111.plist</string> <key>3</key> <string>levelselectone/themescene2-hd.plist</string> <key>2</key> <string>levelselectone/stages_bg-hd.plist</string> <key>1</key> <string>Hmenu/mainscene1-hd.plist</string> </dict> </dict> </plist>
像這樣寫(xiě)一下,用xcode編寫(xiě)著會(huì)方便一點(diǎn)。
第二步:代碼的編寫(xiě)
1.資源場(chǎng)景代碼編寫(xiě)
首先我先編寫(xiě)了一個(gè)場(chǎng)景基類,功能很簡(jiǎn)單,就是通過(guò)類的init函數(shù)(初始化函數(shù))加載背景,加載進(jìn)度條,之后啟動(dòng)一個(gè)定時(shí)器,過(guò)0.5秒后加載資源 。
// // LoadSceneBase.h // TDgame05 // // Created by Za aa on 13-6-4. // // #ifndef __TDgame05__LoadSceneBase__ #define __TDgame05__LoadSceneBase__ #include "cocos2d.h" USING_NS_CC; class LoadSceneBase : public CCLayer { public: LoadSceneBase(); ~LoadSceneBase(); //--1.0--初始化 bool init(); //生成背景和logo等 virtual void addBackGround(){}; //添加一個(gè)progress virtual CCProgressTimer * addProgress(){}; //將需要加載的資源放在這個(gè)函數(shù)中,倍update調(diào)用.別忘了切換場(chǎng)景啊 virtual void loadResources(); //啟動(dòng)加載資源 void update(float dt); //加載資源快捷方法 void loadingPVR(const char * plist); //加載資源快捷方法2 void loadingPVRs(const char * plist,...); public: //進(jìn)度條 CCProgressTimer * _pross; }; #endif /* defined(__TDgame05__LoadSceneBase__) */
// // LoadSceneBase.cpp // TDgame05 // // Created by Za aa on 13-6-4. // // #include "LoadSceneBase.h" LoadSceneBase::LoadSceneBase():_pross(NULL) { } LoadSceneBase::~LoadSceneBase() { } bool LoadSceneBase::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); //生成背景和logo等 addBackGround(); //添加進(jìn)度條 _pross = addProgress(); if (_pross!= NULL) this->addChild(_pross); //0.5秒后加載資源 this->scheduleOnce(schedule_selector(LoadSceneBase::update),0.5f); bRet = true; } while (0); return bRet; } void LoadSceneBase::loadResources() { loadingPVRs("111","222"); //TODO: 切換場(chǎng)景 } void LoadSceneBase::update(float dt) { loadResources(); } void LoadSceneBase::loadingPVR(const char * plist) { CCTexture2D::PVRImagesHavePremultipliedAlpha(true); CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(plist); } //加載資源快捷方法2 void LoadSceneBase::loadingPVRs(const char * plist,...) { //進(jìn)度條 float t_loading ; //------------獲取個(gè)數(shù)-------------- int num= 0 ; //需先定義參數(shù)列表變量 va_list argp; //初始化,使用argp指向可變參數(shù)的第一個(gè)參數(shù), va_start(argp, plist); //其后省略的參數(shù)是根據(jù)函數(shù)第一個(gè)參數(shù)的偏移量來(lái)獲得 while (true) { if(va_arg(argp, const char *)== NULL) break; num++; } //結(jié)束可變參數(shù)獲取 va_end(argp); //-------------進(jìn)行裝載------- //加載頭一個(gè)資源 t_loading = 100.0f*1/(num+1); _pross->setPercentage(t_loading); loadingPVR(plist); va_list argp2; va_start(argp2,plist); for (int i=1; i<=num; i++) { //修改進(jìn)度條 t_loading = 100.0f*(i+1)/(num+1); _pross->setPercentage(t_loading); loadingPVR(va_arg(argp2, const char *)); } va_end(argp2); }
之后繼承這個(gè)類,并實(shí)現(xiàn)幾個(gè)虛方法
// // LoadingGameScene.h // TDgame05 // // Created by Za aa on 13-6-3. // NOTE: 創(chuàng)建一個(gè)加載游戲的界面,這個(gè)界面會(huì)向內(nèi)存中加載一些資源 // #ifndef __TDgame05__LoadingGameScene__ #define __TDgame05__LoadingGameScene__ #include "cocos2d.h" #include "../global/LoadSceneBase.h" class LoadingGameScene :public LoadSceneBase { public: //創(chuàng)建一個(gè)create函數(shù)調(diào)用父類init CREATE_FUNC(LoadingGameScene); //生的一個(gè)CCScene static CCScene * CreateLoadingGameScene(); //父類方法。添加背景 void addBackGround(); //父類方法,添加一個(gè)進(jìn)度條 CCProgressTimer *addProgress(); //父類方法,在這個(gè)方法中加載資源 void loadResources(); }; #endif /* defined(__TDgame05__LoadingGameScene__) */
// // LoadingGameScene.cpp // TDgame05 // // Created by Za aa on 13-6-3. // // #include "LoadingGameScene.h" #include "../LoadLevelinfo/LoadLevelinfo.h" void LoadingGameScene::addBackGround() { //添加背景和logo等 } CCProgressTimer * LoadingGameScene::addProgress() { //添加一個(gè)進(jìn)度條并返回 return NULL; } /*--------------------------------------- 加載所需的資源, 可以通過(guò)loadPVR(),或者loadPVRs()函數(shù)加載資源 -----------------------------------------*/ void LoadingGameScene::loadResources() { //--you need to remove : loadlevelinfo 測(cè)試-- LoadLevelinfo *info = LoadLevelinfo::createLoadLevelinfo("values/Level_01_01.plist"); CCLog("p_w_picpath 01 path is :%s",info->f_GetLoadingImages(1)); //-- } CCScene* LoadingGameScene::CreateLoadingGameScene() { // 'scene' is an autorelease object CCScene *scene = CCScene::create(); // 'layer' is an autorelease object LoadingGameScene *layer = LoadingGameScene::create(); // add layer as a child to scene scene->addChild(layer); // return the scene return scene; }
其中l(wèi)oadresources函數(shù)中的LoadLevelinfo封裝了讀取plist文件的方法,馬上就說(shuō)是怎么遍的
2.封裝讀取plist文件方法
看代碼
// // LoadLevelinfo.h // TDgame05 // // Created by Za aa on 13-6-17. // // #ifndef __TDgame05__LoadLevelinfo__ #define __TDgame05__LoadLevelinfo__ #include "cocos2d.h" using namespace cocos2d; #define NEEDTOLOADIMAGES "needtoloadp_w_picpaths" #define LEVELPARAMETER "levelparameter" class LoadLevelinfo: public CCObject { public: //構(gòu)造函數(shù) LoadLevelinfo(); ~LoadLevelinfo(); static LoadLevelinfo * createLoadLevelinfo(const char *plistpath); //變更plist bool f_SetPlist(const char * plistpath); //獲取關(guān)卡信息 根據(jù)key float f_GetLevelInfo(const char * key); //獲得tmx瓦片地圖文件路徑 const char * f_GetLevelTmxPath(const char * key); /* 獲取預(yù)加載圖片的容器 讀取的plist格式是這個(gè)樣子滴 <key>4</key> <string>loadingHMenu/111.plist</string> <key>3</key> <string>levelselectone/themescene2-hd.plist</string> <key>2</key> <string>levelselectone/stages_bg-hd.plist</string> <key>1</key> <string>Hmenu/mainscene1-hd.plist</string> */ const char * f_GetLoadingImages(int key); //清空已經(jīng)讀取的字符串 void f_ClearAll(); /* data */ private: //保存關(guān)卡需要預(yù)加載的圖片 CCDictionary * s_NeedToLoadImages; //保存關(guān)卡的相關(guān)的數(shù)值信息 CCDictionary * s_LevelParameter; private: }; #endif /* defined(__TDgame05__LoadLevelinfo__) */
// // LoadLevelinfo.cpp // TDgame05 // // Created by Za aa on 13-6-17. // // #include "LoadLevelinfo.h" LoadLevelinfo::LoadLevelinfo() { } LoadLevelinfo::~LoadLevelinfo() { //TODO: 安全刪除s_arr //f_ClearAll(); // CC_SAFE_RELEASE(s_LevelParameter); // CC_SAFE_RELEASE(s_NeedToLoadImages); } LoadLevelinfo *LoadLevelinfo::createLoadLevelinfo(const char *plistpath) { LoadLevelinfo *pRet = new LoadLevelinfo(); if (pRet && pRet->f_SetPlist(plistpath)) { pRet->autorelease(); return pRet; } else { delete pRet; pRet = NULL; return NULL; } } //變更plist bool LoadLevelinfo::f_SetPlist(const char *plistpath) { bool bRet = false; do { /* code */ // if (s_LevelParameter != NULL && s_NeedToLoadImages != NULL) // f_ClearAll(); //創(chuàng)建一個(gè)實(shí)力 CCDictionary *ccd = CCDictionary::createWithContentsOfFile(plistpath); CC_BREAK_IF(!ccd); //進(jìn)入關(guān)卡所需加載圖片資源的節(jié)點(diǎn) s_NeedToLoadImages = dynamic_cast<CCDictionary *>(ccd->objectForKey(NEEDTOLOADIMAGES)); CC_BREAK_IF(!s_NeedToLoadImages); //進(jìn)入關(guān)卡所需信息節(jié)點(diǎn) s_LevelParameter = dynamic_cast<CCDictionary *>(ccd->objectForKey(LEVELPARAMETER)); CC_BREAK_IF(!s_LevelParameter); //You need to remove : 輸出調(diào)試信息 CCLog("Needtoloadp_w_picpaths count is : %d", s_NeedToLoadImages->count()); CCLog("levelparameter count is : %d", s_LevelParameter->count()); bRet = true; } while (0/* condition */); return bRet; } //清空已經(jīng)讀取的字符串 void LoadLevelinfo::f_ClearAll() { s_NeedToLoadImages->removeAllObjects(); s_LevelParameter->removeAllObjects(); } //獲取關(guān)卡信息 根據(jù)key float LoadLevelinfo::f_GetLevelInfo(const char *key) { CCString * temp = dynamic_cast<CCString*>(s_LevelParameter->objectForKey(key)); return temp->floatValue(); } const char * LoadLevelinfo::f_GetLevelTmxPath(const char * key) { CCString * temp = dynamic_cast<CCString*>(s_LevelParameter->objectForKey(key)); return temp->getCString(); } //獲取預(yù)加載圖片的容器 const char *LoadLevelinfo::f_GetLoadingImages(int key) { CCString * pString = CCString ::createWithFormat("%d",key); CCString * temp = dynamic_cast<CCString*>(s_NeedToLoadImages->objectForKey(pString->getCString())); return temp->getCString(); }
基本上這樣就可以了,改動(dòng)一點(diǎn)點(diǎn)就能用了
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。