溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

cocos2d-x 菜鳥(niǎo)編塔防 05 預(yù)加載資源

發(fā)布時(shí)間:2020-07-24 17:24:14 來(lái)源:網(wǎng)絡(luò) 閱讀:1488 作者:83628410 欄目:游戲開(kāi)發(fā)

前言:

前面幾篇文章很基本的實(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)思一下整體的流程,像這樣


cocos2d-x 菜鳥(niǎo)編塔防 05 預(yù)加載資源

這樣的思路就是,根據(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è)敵人等

像這樣


cocos2d-x 菜鳥(niǎo)編塔防 05 預(yù)加載資源



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)就能用了



向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI