《保卫萝卜》分析续——地图构成
上一篇文章我们分析了《保卫萝卜》的精灵显示部分,已经动画部分,详情见关于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();}
以上就是最近一段时间分析的结果,下一次我们将分析《保卫萝卜》的战斗系统实现,非常有意思的一个游戏。。。。
本次实现的演示程序下载地址演示程序
《保卫萝卜》分析续——地图构成相关推荐
- sql server 存储过程中使用变量表,临时表的分析(续)
最近,我有一朋友,对我说他的数据库中的很多存储过程,执行都是超时.让我替他看看是什么原因.我一看,原来他的存储过程中用了很多的临时表与变量表.于是我跟他说过犹不及. 在存储过程中使用临时表或变量表,使 ...
- HGE2D引擎按键消息分析(续)
继续上一章对其按键消息处理抽丝剥茧.看BuildEvent()函数里面 我们先来分析其这段代码 if(type==INPUT_KEYDOWN) { if((flags & HGEINP_REP ...
- sys_brk分析 linux1.2.0版本,linux内存管理之sys_brk实现分析(续)
看上面可以看出:clear_page_tables中,要操作的线性地址即为prev,prev->next之间的空洞线性地址.理解了这点之后,上面的代码就变得很简单了^_^ 三:用户空间的伸展 先 ...
- 分析称地图服务将成移动行业未来
移动行业的未来或许在于地图服务.除驾车导航和本地商户搜索之外,围绕移动地图的竞争主要在于,哪家公司能推出最强大的工具,回答移动设备用户提出的多种多样的问题.这将成为苹果.谷歌.微软和Fa ...
- matlab 相关性分析 相关系数地图生成
相关性检验公式: 输入表格结构展示:第一行为参数表头 第一列为样本序号 最后一列为说需预测的真实值 参考代码: %%相关系数分析.相关性分析 %foddcus %输入:input_c 相关系数检验的表 ...
- 奇迹Mu分析 - Bool地图
通过读取游戏内存,绘制角色当前地图 var MapBase:Cardinal = $86E9D78; function TMain.GetMapPointByIndex(n: Cardinal): W ...
- linux brk函数,linux内存管理之sys_brk实现分析(续)
unmap_region是整个收缩过程中的核心,它主要完成相应项表项的修改,具体映射页框的释放 代码如下: static void unmap_region(struct mm_struct *mm, ...
- 逆向分析war3地图
博客已经转移 https://noone-hub.github.io/ 这个题目怪吧,地图分析,其实不然,这个地图跟软件的差别大致上来说是一样的,war3地图可以加密,软件可以加壳,war3地图内部有 ...
- Creator实战项目【保卫萝卜】-- 修改地图
创建游戏主场景,拖一张格子地图放入层级管理器,把Tmx Asset中的属性删掉. 编写地图控制脚本,在TiledMapCtrl.ts中,公布一个地图资源数组,把多个格子地图拖进去. @property ...
最新文章
- Python基本语法_输入/输出语句详解
- 这些让人抓狂的烂代码,你碰到几种?
- alexnet训练多久收敛_卷积神经网络之AlexNet
- 转 安装php时报gd相关的错误(gd_ctx.c)
- 熊猫分发_熊猫新手:第二部分
- Spring中使用byType实现Beans自动装配
- php原生读取excel文件夹,原生php实现excel文件读写的方法分析php技巧
- 学会这三种贷中调额方法,今年优化list没我
- 学习成为一个IT架构师
- strcat与strncat的C/C++实现
- Sql Server之旅——第二站 理解万恶的表扫描
- SQL SERVER 不允许保存更改
- Excel表格文件,.xls和.xlsx格式的区别
- 量子世界的测不准定律
- 邮件群发软件使用攻略
- 供应链金融与区块链02——论文阅读
- 对新手严重不友好的强者——Nginx那些俯拾皆是的坑
- 课堂笔记(3) 假设检验 Hypothesis testing
- iOS22 地图定位- 苹果自带地图
- 读论文 A search-classify approach for cluttered indoor scene understanding