在了解地图的初始化和加载之前,我们先了解下mario的地图。
用tiled工具打开mario地图
从地图中可以看到,mario的地图有很多层构成:
objects层:怪物,会动的怪物
coin层:金币
trap层:陷阱
block层:砖头,砖头有好几种,带问号的,普通砖头,拦路的等等
pipe层:水管
flagpole层:终点旗帜
land层:承重的路面
mountain层:远处的山
cloud层:天上的云
background层:背景层
land,mountain,cloud,background,pipe这些层都不需要变化,只是需要移动罢了
金币,砖头,怪物这些层的精灵,需要移动或者消失,处理不相同
在init函数中,我们看怪物的初始化吧,以下代码是初始化怪物的代码,我们一句句来分析这些代码
//初始化怪物显示 CCTMXObjectGroup* pObjectLayer = objectGroupNamed("objects"); CC_BREAK_IF(pObjectLayer==NULL); CCArray *ObjectArray = pObjectLayer->getObjects(); CCDictionary *pDic = NULL; for (unsigned int i = 0; i < ObjectArray->count(); i++) { pDic = (CCDictionary *)ObjectArray->objectAtIndex(i); int PosX = ((CCString*)pDic->objectForKey("x"))->intValue(); int PosY = ((CCString*)pDic->objectForKey("y"))->intValue(); PosY -= this->getTileSize().height; CCPoint TileXY = ccp(PosX, PosY); CCString *strName = (CCString*)pDic->objectForKey("name"); CCString *strType = (CCString*)pDic->objectForKey("type"); // 进行怪物的初始化,先根据名字来判断是不是enemy,再细分enemy类型 if (strName->m_sString == "enemy") { if (strType->m_sString == "mushroom") { CMMonsterMushrooms *pMonster = CMMonsterMushrooms::CreateMonsterMushrooms(TileXY,pMario,this,this); if (pMonster==NULL) { CCLog("pMonster==NULL!"); } pMonster->setPosition(ccp(TileXY.x,TileXY.y)); pMonster->setAnchorPoint(ccp(0,0)); m_pArrayMonsters->addObject(pMonster); addChild(pMonster,enZOrderFront); } if (strType->m_sString == "tortoise") { CMMonsterTortoise *pMonster = CMMonsterTortoise::CreateMonsterTortoise(TileXY,pMario,this,this); if (pMonster==NULL) { CCLog("pMonster==NULL!"); } pMonster->setPosition(ccp(TileXY.x,TileXY.y)); pMonster->setAnchorPoint(ccp(0,0)); m_pArrayMonsters->addObject(pMonster); addChild(pMonster,enZOrderFront); } if (strType->m_sString == "flower") { CMMonsterFlower *pMonster = CMMonsterFlower::CreateMonsterFlower(TileXY,pMario,this,this); if (pMonster==NULL) { CCLog("pMonster==NULL!"); } pMonster->setPosition(ccp(TileXY.x,TileXY.y)); pMonster->setAnchorPoint(ccp(0,0)); m_pArrayMonsters->addObject(pMonster); addChild(pMonster,enZOrderFront); } } }
objects层描述了这些怪物的位置
CCArray *ObjectArray = pObjectLayer->getObjects();这句代码,将怪物层的所有怪物精灵保存到ObjectArray的数组中
for (unsigned int i = 0; i < ObjectArray->count(); i++) 然后遍历所有的精灵
pDic = (CCDictionary *)ObjectArray->objectAtIndex(i); 获取下标i对应的精灵属性,返回的是一个字典,字典里保存着该精灵的所有属性
int PosX = ((CCString*)pDic->objectForKey("x"))->intValue();
int PosY = ((CCString*)pDic->objectForKey("y"))->intValue();
CCString *strName = (CCString*)pDic->objectForKey("name");
CCString *strType = (CCString*)pDic->objectForKey("type");
以上四句代码演示了,如何通过字典来获取精灵的属性
if (strType->m_sString == "mushroom")
{
CMMonsterMushrooms *pMonster = CMMonsterMushrooms::CreateMonsterMushrooms(TileXY,pMario,this,this);
if (pMonster==NULL)
{
CCLog("pMonster==NULL!");
}
pMonster->setPosition(ccp(TileXY.x,TileXY.y));
pMonster->setAnchorPoint(ccp(0,0));
m_pArrayMonsters->addObject(pMonster);
addChild(pMonster,enZOrderFront);
}
以上代码演示的是,如果这个怪物是蘑菇怪,那么创建蘑菇怪精灵,然后将蘑菇怪精灵设置好位置之后,加入到m_pArrayMonsters中。
将蘑菇怪保存到m_pArrayMonsters中,是为了马里奥移动时,要判断蘑菇怪和马里奥的碰撞检测。
砖头和金币的初始化,比怪物更加简单,这里不再叙述,大家可以自己看代码。