cocos2d-x 游戏中障碍物的实现原理
2013-12-24 15:12
295 查看
也许大家在cocos2d-x的学习中,可能很少去使用地图。(我当初刚学cocos2d的时候)也是尝试着去使用地图但是却不能利用地图做任何事情,当时在我看来,这地图是什么玩意啊,跟使用精灵的方法加载一张背景图片没什么两样嘛!后来我就不去使用地图了,因为不知道地图的功能。再后来,我发现仅仅使用背景是不能满足实际项目的需要的(具体是
哪方面的我就不解释啦)。所以我又回过头来研究地图这块,以我现在的学习情况看来,我觉得地图这块其实也不难做,只要愿意下些功夫专研。
我来给大家说两点地图坐标系和屏幕坐标系(1):别人说过的我就不多讲了(比如什么一个是y轴向下一个向上之类的。老生常谈,);我要说的是屏幕坐标是是以(点)为基本元素,而地图坐标系是以方格为基本元素:就像这样:
![](http://img.blog.csdn.net/20131224144936421)
一格一格的。每个格子代表一个坐标。格子的大小是我们自己在创建地图的时候自己定的!
(这第二,不好意思忘了,回头我想起来再写上!)
好,那我接下来就给大家分享下游戏中障碍物得实现;我再收集网上的一些教程时,发现他们都是把主角精灵直接放到地图当中,其实没必要。(可能大家听得不是很明白:那我就说白一点:就是地图中的东西是完全可以和主角分开的。我举个例子:比如在地图中设置一个静止的障碍物,游戏场景中有一个(主角僵尸),那是不是说只有把主角僵尸精灵使用addChild()加载到地图中才能检测主角被障碍物阻止了呢!其实不是的。)
这章的源码如果都写出来可能一章写不完,所以我就随便贴点代码,有需要的可以在评论里留言。
好下面开始说障碍物的实现:(我先不些代码大家先看下这个地图)
![](http://img.blog.csdn.net/20131224144458593)
大家看那个红色的区域,它是地图中的一个图层。我们可以使用map-》layername("Layer");来获取这个图层;再来看哪些红色的格子,它代表该图层的精灵。我们可以通过地图格子坐标的方法获取这些精灵;(那你也许会问怎么样才可以轻易的获取坐标呢?给大家看个图:)
![](http://img.blog.csdn.net/20131224145742109)
大家看这个(7,21),就是地图中的一个精灵;这很好获取;
我们要实现障碍物,就就必须把主角僵尸的坐标先转化成地图格子坐标(而且要动态转化);
这样就可以了:是不是很easy!
哪方面的我就不解释啦)。所以我又回过头来研究地图这块,以我现在的学习情况看来,我觉得地图这块其实也不难做,只要愿意下些功夫专研。
我来给大家说两点地图坐标系和屏幕坐标系(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!
相关文章推荐
- cocos2dx之CCTMXTiledMap
- cocos2dx tinyxml读写示例,tinyxml2读xml示例,
- cocos2dx 利用schedule实现长按触发事件功能
- cocos2d-x游戏开发系列教程-坦克大战游戏之子弹和地图碰撞
- cocos2d-x游戏开发系列教程-坦克大战游戏之子弹和地图碰撞
- iOS和android游戏纹理优化和内存优化(cocos2d-x)(转载)
- cocos2d-x::Animations
- Cocos2d-x::Actions
- cocos2dx 常见的32种切换场景的动画
- [quick-cocos2d-x lua学习] 让游戏竖屏显示
- Cocos2d-x中的数组类CCArray深入分析
- iphone游戏开发 资料索引 cocos2d, OpenGL ES
- cocos2dx之CCTableView
- Cocos2d-x全屏适配问题
- 从Delphi开始学Cocos2dx-3.0[9]:持续动作之缩放持续动作
- cocos2dx 粒子系统
- 从Delphi开始学Cocos2dx-3.0[8]:持续动作之位移持续动作
- Cocos2D常用动作(Action)
- Cocos2d-x--自定义血条
- cocos2dx 常用的构建工具