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<MonsterMessage> 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[i];
		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[64];
		strcpy(c,monsterStr.c_str());
		char* s = strtok(c,"|");
		while(s != NULL){
			int id_num;
			stringstream ss;
			ss << s;
			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.源码分享

源码下载地址:点击打开链接

我在上传之前在VS2012+cocos2dx3.2平台下运行成功。


3.已经打包好的apk

上次消灭星星大家说移植到Android平台有问题,这次我特意也移植了,android平台是可以运行的。

APK下载地址:点击打开链接

至此,整个Cocos2dx 3.2开发RPG《Flighting》系列到此结束,谢谢大家。

我的csdn地址:http://blog.csdn.net/hezijian22

邮箱地址:578690286@qq.com

如有问题或指教,欢迎与我交流,谢谢。

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...