上一篇文章我们分析了《保卫萝卜》的精灵显示部分,已经动画部分,详情见关于pvr和plist的联合使用
在这篇文章了,我们看看《保卫萝卜》的地图是怎么设计的,通过其资源我们可以看到游戏资源里有tmx,基本上第一感觉就是tiled map editor这个开源的地图编辑器制作的。
那么我们打开来看看。因为tmx里有资源的图片数据,如果你没有的话,就会弹一个窗,默认是这个情况
这个图,告诉我们,几个信息,一个tile大小是多少,有多少个,就是一张地图有什么一个规模的样子,在右侧有些对象,可以有的有一些属性。如下图:
可能初步一看,还不知道这些对象有什么作用,如果我们配合着这张地图的实际场景图来看一下,就会有些线索。
现在比较有些意思里,对着这上图里那些对象属性,我们基本上可以知道,有对象属性的地方,其实是有预先放置的游戏物件的地方。中间有看到有些对象(那种小矩形)有
摸不着头脑是啥作用,后来在想a星算法的时候,恍然大悟,这应该就是所谓的导航点。其实就是为了跑路用的。
现在基本知道《保卫萝卜》的地图构成了,
如果要自己实现《保卫萝卜》的地图,一个就是知识要点就是tmx文件的应用。另一个就是对上一章cocos2dx精灵的灵活运用。
1、关于tmx文件的读取应用,给一个对tmx文件中对象的信息获取的例子
CCTMXTiledMap* map = CCTMXTiledMap::create("luobo/BGPath.tmx");
addChild(map, 0, kTagTileMap);
CCTMXObjectGroup* pObjGrp = map->objectGroupNamed("PATH");
if (pObjGrp)
{
/* CCDictionary* pDic = pObjGrp->objectNamed("1Ob2");
int type = pDic->valueForKey("type")->intValue();
CCLOG("type:%d",type);*/
CCArray* objArray = pObjGrp->getObjects();
if (objArray && objArray->count() > 0)
{
CCObject* pObj = NULL;
CCARRAY_FOREACH(objArray, pObj)
{
CCDictionary* spawnPoint = (CCDictionary*)pObj;
CCDictElement *keyString = NULL;
CCDICT_FOREACH(spawnPoint, keyString)
{
const char *xps = keyString->getStrKey();
CCLog("dict:key %s", xps);
CCString *xps1 = (CCString *)(keyString->getObject());
CCLog("dict:value %s", xps1->getCString());
}
}
}
}
基本上,没有什么注释,但是比较易懂,一看就明白什么意思。其实这一段代码读取就是tmx文件里的objectgroup标签下的内容,我们用文本编辑器打开tmx地图可以看到如下
从文件中可以看到,这里的坐标都是绝对坐标值,而不是tile的坐标。
而精灵沿着路径走的逻辑,其实就是基本游戏里该有的逻辑,就是一个速度与时间的关系。如下列示例代码,(由于时间关系,写的非常不好看,凑合看看)
char path[16] = {0};
sprintf_s(path,"PT%d",m_index);
b2Vec2 target;
CCDictionary* pDic = m_objgrp->objectNamed(path);
target.x = pDic->valueForKey("x")->intValue() + 40;
target.y = pDic->valueForKey("y")->intValue() - 40;
b2Vec2 cur_pos(m_pos.x,m_pos.y);
b2Vec2 vec = target - cur_pos;
float dis = vec.Normalize();
if (dis < MIN_DISTANCE)
{
m_index++;
}
cur_pos += m_speed * dt * vec;
CCSprite *pAni = (CCSprite*)getChildByTag(MONSTER_LAYER_ID);
if (pAni)
{
CCLog("cur pos:%f,%f",cur_pos.x,cur_pos.y);
pAni->setPosition(ccp(cur_pos.x,cur_pos.y));
m_pos = pAni->getPosition();
}
以上就是最近一段时间分析的结果,下一次我们将分析《保卫萝卜》的战斗系统实现,非常有意思的一个游戏。。。。
本次实现的演示程序下载地址演示程序