cocos2d-x 游戏中障碍物的实现原理

来源:互联网 发布:手机怎么开淘宝直播 编辑:程序博客网 时间:2024/04/30 20:24

       也许大家在cocos2d-x的学习中,可能很少去使用地图。(我当初刚学cocos2d的时候)也是尝试着去使用地图但是却不能利用地图做任何事情,当时在我看来,这地图是什么玩意啊,跟使用精灵的方法加载一张背景图片没什么两样嘛!后来我就不去使用地图了,因为不知道地图的功能。再后来,我发现仅仅使用背景是不能满足实际项目的需要的(具体是

哪方面的我就不解释啦)。所以我又回过头来研究地图这块,以我现在的学习情况看来,我觉得地图这块其实也不难做,只要愿意下些功夫专研。

       我来给大家说两点地图坐标系和屏幕坐标系(1):别人说过的我就不多讲了(比如什么一个是y轴向下一个向上之类的。老生常谈,);我要说的是屏幕坐标是是以(点)为基本元素,而地图坐标系是以方格为基本元素:就像这样:


一格一格的。每个格子代表一个坐标。格子的大小是我们自己在创建地图的时候自己定的!

(这第二,不好意思忘了,回头我想起来再写上!)

       好,那我接下来就给大家分享下游戏中障碍物得实现;我再收集网上的一些教程时,发现他们都是把主角精灵直接放到地图当中,其实没必要。(可能大家听得不是很明白:那我就说白一点:就是地图中的东西是完全可以和主角分开的。我举个例子:比如在地图中设置一个静止的障碍物,游戏场景中有一个(主角僵尸),那是不是说只有把主角僵尸精灵使用addChild()加载到地图中才能检测主角被障碍物阻止了呢!其实不是的。)

      这章的源码如果都写出来可能一章写不完,所以我就随便贴点代码,有需要的可以在评论里留言。

好下面开始说障碍物的实现:(我先不些代码大家先看下这个地图)


大家看那个红色的区域,它是地图中的一个图层。我们可以使用map-》layername("Layer");来获取这个图层;再来看哪些红色的格子,它代表该图层的精灵。我们可以通过地图格子坐标的方法获取这些精灵;(那你也许会问怎么样才可以轻易的获取坐标呢?给大家看个图:)

大家看这个(7,21),就是地图中的一个精灵;这很好获取;


我们要实现障碍物,就就必须把主角僵尸的坐标先转化成地图格子坐标(而且要动态转化);

 

void JsLayer::update(float dt){转化过程!CCSize mapTiledNum = _map->getMapSize();  CCSize tiledSize = _map->getTileSize(); CCPoint point1 =this->_jsSprite->getPosition();point1.x=point1.x - this->speed;this->_jsSprite->setPosition(ccp(point1.x,point1.y));int x =this->_jsSprite->getPosition().x/ tiledSize.width;  int y =this->_jsSprite->getPosition().y/ tiledSize.height;  /* Cocos2d-x的默认Y坐标是由下至上的,所以要做一个相减操作 */  y = mapTiledNum.height - y;        int tiledGid=_map->layerNamed("zhangai")->tileGIDAt(ccp(x,y));  if(tiledGid!=0)  {CCDictionary* propertiesDict = _map->propertiesForGID(tiledGid);  /* 取得格子的zhezhao属性值 */  const CCString* prop = propertiesDict->valueForKey("zhezhao");  /* 判断zhezhao属性是否为true,是的话,不让玩家移动 */  if(prop->m_sString.compare("true") == 0) {  this->unscheduleUpdate();}    } }

这样就可以了:是不是很easy!





         

0 0
原创粉丝点击