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

35 篇文章 0 订阅

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

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


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


“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 9

打赏作者

djvc

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值