在EnemyMgr的初始化时:
bool CEnemyMgr::init()
{
if (!Node::init())
{
return false;
}
//拿到关卡数据
int nLevelId = CDynamicData::getInstance()->getLevelId();
pLevelDt = CConfigMgr::getInstance()->getData("LevelDtMgr")->getDataByID<CLevelDt*>(nLevelId);
//通过关卡拿到怪物波的数据(定义一个索引)
m_pCurWave = pLevelDt->vecWaves[m_nWaveIndex];
//定时器:怪物定时出现(怪物波数据中的间隔)
this->schedule(CC_CALLBACK_1(CEnemyMgr::addEnemy, this), m_pCurWave->fInterval, "addEnemy"); //调用addEnemy函数,增加怪物数量
return true;
}
在addEnemy中:
void CEnemyMgr::addEnemy(float fDt)
{
//怪物数量 >= 当前波定义的那个怪物数
if (m_nCount >= m_pCurWave->nCount ) //最后一只怪物(当前这波满了)
{
//最后一波怪物
if (m_nWaveIndex >= pLevelDt->vecWaves.size()-1)
{
return; //跳出函数执行
}
//切换到下一波怪
m_nCount = 0; //怪物数量置零
m_nWaveIndex++; //波索引++
m_pCurWave = pLevelDt->vecWaves[m_nWaveIndex]; //把新怪物波赋给当前怪物波
//关闭添加怪物的定时器
this->unschedule("addEnemy");
//开启切换到下一个怪物波的定时器(用匿名函数)
this->scheduleOnce([this](float fDt) -> void{
this->schedule(CC_CALLBACK_1(CEnemyMgr::addEnemy, this),m_pCurWave->fInterval,"addEnemy"); //开启添加怪物计时器
}, m_pCurWave->fNextInterval, "openNextWave");
return; //怪物已经是最后一只,不再执行后面的代码
}
m_nCount++; //怪物数量增加
//根据数据创建怪物
CEnemyDt* pConfig = CConfigMgr::getInstance()->getData("EnemyDtMgr")->getDataByID<CEnemyDt*>(m_pCurWave->nEnemyId);
CEnemy* pEnemy = CEnemy::createWithData(pConfig);
//设置怪物的初始位置
float fx = rand()%280 + 20;
float fy = visibleSize.height + 100;
pEnemy->setPosition(fx, fy);
this->addChild(pEnemy);
}