cocos2d-x飞机大战——敌人生成、移动,从json表中获取数据

一、配置json表,从json表中获取数据

1、配置json表:“{}”代表对象,“[]”代表数组,“:”左边表示键,右边表示值,数据之间用“,”隔开,具体配置表如下

[
    {
      "id":1001,
      "atc":100,
      "hp":100,
      "interval":2,
      "pics":
        ["Plane1_0.png",
        "Plane1_1.png"]
    },
    {
      "id":1002,
      "atc":200,
      "hp":200,
      "interval":3,
      "pics":
        ["Plane2_0.png",
        "Plane2_1.png"]
    },
    {
      "id":1003,
      "atc":50,
      "hp":50,
      "interval":1,
      "pics":
        ["Plane3_0.png",
        "Plane3_1.png"]
    }
]

json表数据的读取,具体代码如下:

void CEnemyDtMgr::LoadFile(char* pFileName)
{
	//获取全路径
	string str = FileUtils::getInstance()->fullPathForFilename(pFileName);
	string strData = FileUtils::getInstance()->getStringFromFile(str);

	//解析json,将内容存入doc中
	rapidjson::Document doc;
	doc.Parse<0>(strData.c_str());
	//创建document对象:解析json
	for (int i = 0; i < doc.Size();i++)
	{
		SEnemyDt* pData = new SEnemyDt();
		rapidjson::Value& vdata = doc[i];
		pData->nID = vdata["id"].GetInt();
		pData->nAtc = vdata["atc"].GetInt();
		pData->nHP = vdata["hp"].GetInt();
		pData->fInterval = vdata["interval"].GetDouble();
		rapidjson::Value& vPics = vdata["pics"];
		for (int j = 0; j < vPics.Size();j++)
		{
			pData->vecPicNames.push_back(vPics[j].GetString());
		}
		vecDatas.push_back(pData);
	}
	doc.Clear();
}

因为rapidjson和Doucument 头文件位于cocos2d\external\json中,编译器并不能直接获取到,所以在头文件生命中应写入#include "json/rapidjson.h"
#include "json/document.h"

二、敌人生成、移动

敌人数据的读取、初始化与之前的C++控制台项目类似,DataMgr管理EnemyDtMgr,EnemyMgr封装了LoadFile()方法和getByID(),EnemyDt里面绑定了敌人的数据,Enemy类归EnemyMgr管理,EnemyMgr通过对DataMgr的调用获取相应的数据,并对敌机进行初始化,具体代码如下:

CEnemy:

#ifndef __ENEMY__H
#define __ENEMY__H
#include "cocos2d.h"
#include <string>
#include "StructDt.h"
USING_NS_CC;
using namespace std;
class CEnemy:public Node
{
public:
	CEnemy();
	~CEnemy();
	static CEnemy* creatWithData(SEnemyDt* data);
	bool initWithData(SEnemyDt* data);
	CC_SYNTHESIZE(int, m_nID, ID);
	CC_SYNTHESIZE(int, m_nAtc, Atc);
	CC_SYNTHESIZE(int, m_nHp, Hp);
	CC_SYNTHESIZE(int, m_fInterval, Interval);
private:
	Sprite* m_pSprite;
};
#endif

CEnemyMgr:

#ifndef __ENEMYMGR__H
#define __ENEMYMGR__H
#include <vector>
#include "cocos2d.h"
#include "Enemy.h"
#include "DataMgr.h"
USING_NS_CC;
using namespace std;
class CEnemyMgr:public Node
{
public:
	CEnemyMgr();
	~CEnemyMgr();
	CREATE_FUNC(CEnemyMgr);
	bool init();
	void creatEnemy();
private:
};

#endif

CEnemyMgr的实现:

#include "EnemyMgr.h"
bool CEnemyMgr::init()
{
	if (!Node::init())
	{
		return false;
	}
	this->schedule(CC_CALLBACK_0(CEnemyMgr::creatEnemy, this), 0.5f, "addEnemy");
	return true;
}

CEnemyMgr::CEnemyMgr()
{
}

CEnemyMgr::~CEnemyMgr()
{
}

void CEnemyMgr::creatEnemy()
{
	int nID = rand() % 3 + 1001;
	CEnemy* pEnemy = CEnemy::creatWithData(CDataMgr::getInstance()->getEnemyDtMgr()->getByID(nID));
	//设置坐标并且移动
	float fEnenmyX = 25 + rand() % 195;
	float fEnemyY = 540;
	pEnemy->setPosition(fEnenmyX, fEnemyY);
	MoveBy* move = MoveBy::create(pEnemy->getInterval(), Vec2(0, -600));
	pEnemy->runAction(move);
	this->addChild(pEnemy);
}

map中对enemyMgr进行创建,并让其挂载到map中,实现敌机出现在地图中


bool CGameMap::init()
{
	if (!Layer::init())
	{
		return false;
	}
	initBg();
	//开启updata()
	this->scheduleUpdate();
	//载入精灵帧
	SpriteFrameCache* pCache = SpriteFrameCache::getInstance();
	pCache->addSpriteFramesWithFile("Image/Plane.plist");
	m_pPlayer = CPlayer::create();
	m_pPlayer->setPosition(Vec2(160, 100)); 
	this->addChild(m_pPlayer);
	//加载敌人
	m_pEnemyMgr=CEnemyMgr::create();
	this->addChild(m_pEnemyMgr);
	
	return true;
}

猜你喜欢

转载自blog.csdn.net/qq_41791653/article/details/82592264