一、配置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;
}