《保卫萝卜》分析续——地图构成

来源:互联网 发布:c语言程序注释 编辑:程序博客网 时间:2024/04/27 15:17

上一篇文章我们分析了《保卫萝卜》的精灵显示部分,已经动画部分,详情见关于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();}

以上就是最近一段时间分析的结果,下一次我们将分析《保卫萝卜》的战斗系统实现,非常有意思的一个游戏。。。。


本次实现的演示程序下载地址演示程序


原创粉丝点击