《保卫萝卜》分析续——地图构成
来源:互联网 发布: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();}
以上就是最近一段时间分析的结果,下一次我们将分析《保卫萝卜》的战斗系统实现,非常有意思的一个游戏。。。。
本次实现的演示程序下载地址演示程序
- 《保卫萝卜》分析续——地图构成
- Unity3d开发——保卫萝卜学习笔记一地图编辑器开发
- 撸到猴年马月之保卫萝卜(二)helloworld分析
- 超萌塔防游戏:《保卫萝卜CarrotFantasy》
- 《保卫萝卜》项目实践心得
- 《保卫萝卜2》成功背后的思考
- cocos2dx保卫萝卜项目开发----第一天
- 《保卫萝卜》项目实践(2)
- 【手机应用】“萌”得很成功--保卫萝卜游戏体验
- 撸到猴年马月之保卫萝卜(序)
- 撸到猴年马月之保卫萝卜(三)git入门
- 保卫萝卜游戏开发者:先做新游戏再拓展商业模式
- 【游戏引擎LibGdx】利用演员制作简单动画(简单仿制保卫萝卜开头画面)
- 撸到猴年马月之保卫萝卜(一)cocos2d-x 基本概念
- Menu的自定义实现-------保卫萝卜造塔升级塔菜单实现
- Tiled版本 保卫萝卜之 小怪按照 划定的轨迹走
- Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)
- Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)
- 为什么Response、Request不用前面不用加Context?
- HIVE 查询显示列名 及 行转列显示
- java满汉楼----创建界面
- hive cli命令行选项
- 【每天一个Linux命令】07. Linux中type命令的用法
- 《保卫萝卜》分析续——地图构成
- 此网站安全证书有问题(转http://blog.163.com/whhlcj@126/blog/static/387028772012111853842496/)
- 第二期的项目答辩
- Android应用风格不应照抄iOS
- java远程执行linux命令
- C++ const类型引用做函数参数
- oracle 从备份的控制文件进行完全恢复
- 数据库常见命令总结
- cocos2dx入门之获取当前语言环境