cocos2dx3.2开发 RPG《Flighting》(十五)最后的总结说明,以及源码分享

一、前言
这次的Flighting系列教程一口气写了2天,到这里就要结束了。接下来我说明补充一下一些前面没有提到,但是我觉得有必要讲一下的。

二、正文
1.怪物的出场
前面已经说了一个个的XXXMessageUtil,其实StateMessageUtil是比较特别的。首先我们先看看StateMessage的Excel表(关卡)

前面的字段大家可以参透参透,我主要讲一讲monster字段
monster字段表示这个关卡的怪物对队列,用“|”隔开

class StageMessage{  
public:  
    int id;  
    string name;  
    int reward_money;  
    int reward_exp;  
    int boss;  
    string reward_item;  
    deque monsterDeq;  
};  

```

可以看到,我们的StageMessage也相应的有一个队列monsterDeq
void StageMessageUtil::init(){  
  
    std::string  jsonStr = cocos2d::FileUtils::getInstance()->getStringFromFile("Json/StageMessage.json");  
    rapidjson::Document _mDoc;  
  
    std::string mstr = jsonStr;  
    RETURN_IF(NULL==mstr.c_str()||!mstr.compare(""));  
    _mDoc.Parse<0>(mstr.c_str());  
    RETURN_IF(_mDoc.HasParseError()||!_mDoc.IsObject());  
    const rapidjson::Value &pArr = _mDoc"json"];  
  
    CCLOG("Size = %d",pArr.Capacity());  
  
    for(int i=0;i<pArr.Capacity();++i){  
        StageMessage stage;  
        const rapidjson::Value &temp = pArr;  
        int key = temp"id"].GetInt();  
        stage.id = temp"id"].GetInt();  
        stage.name = temp"name"].GetString();  
        stage.boss = temp"boss"].GetInt();  
        stage.reward_money = temp"reward_money"].GetInt();  
        stage.reward_exp = temp"reward_exp"].GetInt();  
        stage.reward_item = temp"reward_item"].GetString();  
        //这里开始初始化队列  
        string monsterStr = temp"monster"].GetString();  
        char c;  
        strcpy(c,monsterStr.c_str());  
        char* s = strtok(c,"|");  
        while(s != NULL){  
            int id_num;  
            stringstream ss;  
            ss <> id_num;  
            CCLOG("GET ID:%d",id_num);  
            MonsterMessage msg = MonsterMessageUtil::getInstance()->getMessageById(id_num);  
            stage.monsterDeq.push_back(msg);  
            s = strtok(NULL,"|");  
        }  
        CCLOG("DEQ SIZE = %d",stage.monsterDeq.size());  
        stageMap.insert(make_pair(key,stage));  
    }  
    CCLOG("STAGE MAP SIZE = %d",stageMap.size());  
    return;  
}  

```

初始化怪物队列的工作在代码标注的哪里开始
得到队列以后,我们在FlightLayer里面可以检测现在有多少个怪物,如果少于规定个数(我这里是4个),就出来一个
void FlightLayer::updateMonster(){  
    int count = 0;  
    for(auto it=m_rolesArray.begin();it!=m_rolesArray.end();++it){  
        if((**it)->getRoleType() == Role::ROLE_TYPE_MONSTER){  
            ++count;  
        }  
    }  
    if(count < 4){  
        if(m_monsterDeq.size() == 0){  
            return;  
        }  
        MonsterMessage msg = *m_monsterDeq.begin();  
        m_monsterDeq.pop_front();  
        Monster* monster = Monster::create(msg.r_name,this);  
        monster->initWithMessage(msg);  
  
        monster->setPosition(2000,260);  
        this->addRole(monster);  
        CCLOG("ADD MONSTER:%s TO LAYER",msg.name.c_str());  
    }  
    return;  
}  

```

2.源码分享
源码下载地址:http://pan.baidu.com/s/1kTggHmR,1
我在上传之前在VS2012+cocos2dx3.2平台下运行成功。

3.已经打包好的apk
上次消灭星星大家说移植到Android平台有问题,这次我特意也移植了,android平台是可以运行的。
APK下载地址:http://pan.baidu.com/s/1eQtOeI2,1
至此,整个Cocos2dx 3.2开发RPG《Flighting》系列到此结束,谢谢大家。
我的csdn地址:http://blog.csdn.net/hezijian22
邮箱地址:578690286@qq.com
如有问题或指教,欢迎与我交流,谢谢。

感谢大神分享,对初学者非常有帮助!
十分期待服务器端的教程!

:2:前排,留着学习

:7: 谢谢支持

对我这种新手 太有用了 感谢:3::3::3:

我在3.5下无法编译。提示无法打开包括头文件cocoStudio.h怎么办。按照以前的老办法无法添加libcocostudio :6::6::6: