Cocos2d-x游戏实例-《跑跑跑》制作教程(第六篇)——添加障碍物
笨木头花心贡献,啥?花心?不呢,是用心~
转载请注明,原文地址:http://blog.csdn.net/musicvs/article/details/8197262
正文:
注:本文使用到的资源请到这里下载:http://download.csdn.net/detail/musicvs/4769412
哎呀,这游戏实在是太好玩太有意思了(啊,个屁啊~),不过,我们还是要继续优化的喇~
这次我们就来为地图添加障碍物吧~很好玩的,一起来~
1.
再次打开我们的Tiled Map Editor
我们还要打开level01.tmx文件,首先新建一个图层,命名为barrier,也就是我们的障碍层。
然后,我们要介绍一个新的素材,meta_tiles.png:
把objects.png和meta_tiles.png都加进图块里,宽高都是32像素。
2.
添加障碍物
好,现在,我们利用下面的素材在地图的barrier层上画几笔,增加一些障碍物。
下面是我画的,太好看了~(啊才怪!):
3.
让障碍物真正成为障碍物!
别以为它叫做障碍层那它就真的可以阻止主角的前进,主角现在一样能顺利的穿过这些“障碍物”,我们还得新建一个层,叫做meta。
然后选择图块里的红色方块:
然后,右键,“图块属性”,给图块新建一个属性,叫做Collidable,值为true。
是的,我们将会利用这个属性判断是否为障碍物。
现在,我们要用红色方块在meta层上画东西,怎么画?把所有障碍物填满,记住,是在meta层上描。
看看效果,好多红色,哈哈:
OK,保存地图,然后把焦点回到代码里。
4.
通过图块属性判断是否可以通行
大家,我又要改了,我要把Player的CCTMXTiledMap* map成员变量放到Entity里,同时添加一个函数tileCoordForPosition:
#ifndef __ENTITY_H__
#define __ENTITY_H__
#include "cocos2d.h"
#include "Controller.h"
#include "ControllerListener.h"
using namespace cocos2d;
class Entity : public CCNode, public ControllerListener {
public:
void setSprite(CCSprite* mSprite);
void setController(Controller* controller);
/* 实现SimpleMoveListener接口的方法 */
virtual void setSimplePosition(int x, int y);
virtual CCPoint getCurPosition();
protected:
CCSprite* mSprite;
Controller* mController;
/* map本来是在Player类的,现在我们放在这里 */
CCTMXTiledMap* map;
/* 检测碰撞的地图层 */
CCTMXLayer* meta;
/* 将像素坐标转换为地图格子坐标*/
CCPoint tileCoordForPosition(CCPoint pos);
};
#endif
tileCoordForPosition是做什么的呢?它是用来把像素坐标转换为地图里相应的格子的。
CCPoint Entity::tileCoordForPosition( CCPoint pos )
{
CCSize mapTiledNum = map->getMapSize();
CCSize tiledSize = map->getTileSize();
float x = pos.x / tiledSize.width;
float y = pos.y / tiledSize.height;
/* Cocos2d-x的默认Y坐标是由下至上的,所以要做一个相减操作 */
y = mapTiledNum.height - y;
return ccp(x, y);
}
刚刚大家一定发现了,我们还多了一个CCTMXLayer* meta,这是啥?meta不就是我们刚刚给地图加的一个图层么?在这个图层上面我们画了很多红色格子的,而且我们还给这些红色格子加了一个Collidable属性。
我想大家应该要猜到了,我们只要判断主角即将要去的地方是不是在红色格子的位置上就可以了,如果要去的地方是红色格子的位置,那就不让主角移动~哇,听起来好简单~
5.
开始限制主角的行动
现在,请打开Player.cpp类的initWithTiledMap函数,在最开始加上这句代码(什么,你确定是一句?看起来好像是两句吧):
/* 加载meta层 */
meta = map->layerNamed("mate");
meta->setVisible(false);
OK,最后一步,我们修改Player.cpp的setSimplePosition函数,在最前面加上以下几句代码:
/* -----------------判断是否不可通行---------------- */
/* 获得当前主角在地图中的格子位置 */
CCPoint tiledPos = tileCoordForPosition(ccp(x, y));
/* 获取地图格子的唯一标识 */
int tiledGid = meta->tileGIDAt(tiledPos);
/* 不为0,代表存在这个格子 */
if(tiledGid != 0) {
/*
获取该地图格子的所有属性,目前我们只有一个Collidable属性,
格子是属于meta层的,但同时也是属于整个地图的,所以在获取格子的所有属性时,
通过格子唯一标识在地图中取得。
*/
CCDictionary* propertiesDict = map->propertiesForGID(tiledGid);
/* 取得格子的Collidable属性值 */
const CCString* prop = propertiesDict->valueForKey("Collidable");
/* 判断Collidable属性是否为true,是的话,不让玩家移动 */
if(prop->m_sString.compare("true") == 0) {
return;
}
}
好吧,我感觉代码的注释已经很详细了,首先从meta层里获得某个地图格子(某个?咳咳,就是我们主角当前所在的地图格子位置)在地图中的唯一标识。然后根据这个唯一标识在地图中取得格子的所有属性。
有个疑问,为什么要从meta中取得唯一标识而不是直接格局格子位置从地图中获取格子的属性?因为,因为地图有很多个图层啊,我怎么知道你的这个格子位置是那一层的位置啊?你说你要第一行第三列的那个格子,天呐,我有ground图层,有meta图层,你是要哪个?糟糕,我太入戏的,一不小心用了第一人称。所以呢,不要让程序混乱,否则它会让你更混乱~!
最后当然是取得格子的Collidable属性,看看这个属性的值是否为true,是的话,就不让主角前进了。看,主角被那颗高大威猛的树挡着了,不能前进了~
6.
解决卡死问题
我们确实是卡住主角,不让他前进了,但是我们会发现,这一卡就把主角永远卡住了,他再也无法移动了~!这很糟糕。没关系,我们加点东西就好。当遇到障碍物时,不是让主角停止前进,而是让主角后退一个像素:
/* 判断Collidable属性是否为true,是的话,不让玩家移动 */ if(prop->m_sString.compare("true") == 0) {
if(x > 0) {
x -= 1;
}
else {
x += 1;
}
if(y > 0) {
y -= 1;
}
else {
y += 1;
}
}
我们修改了setSimplePosition里的一个小地方,当Collidable属性的值为true时,我们不要直接return,而是让主角稍微往相反方向移动一个像素,这样主角就不会永远动不了了。
OK,本篇结束了,下一篇我们将加入胜利判断条件,以及加入可以让主角吃掉的东西,太帅了~
分享到:
相关推荐
资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...
Cocos2d-x游戏编程——C++篇(电子工业出版社,徐飞 著)书本配套的光盘代码,
Cocos2d-x是移动跨平台开发最流行的游戏引擎,而本书是一本很全面的、比较‘接地气’的游戏开发教程。书中汇聚了热门手机游戏《捕鱼达人》开发的实战经验,作者从最基础的内容开始,逐步深入地介绍了Cocos2d-x的相关...
《Cocos2D-X游戏开发技术精解》详细介绍如何使用Cocos2D-X引擎开发自己的移动平台游戏。全书共15章,主要内容包括:Cocos2D-X引擎简介;如何建立跨平台的开发环境;引擎的核心模块——渲染框架;如何实现动态画面和...
资源名称:大富翁手机游戏开发实战基于Cocos2d-x3.2引擎内容简介:李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发...
资源名称:Cocos2D-X游戏开发技术精解内容简介:Cocos2D-X是一款支持多平台的 2D手机游戏引擎,支持iOS、Android、BlackBerry等众多平台。当前,很多移动平台流行的游戏,都是基于Cocos2D-X开发的。 《Cocos2D-X...
一线资深游戏开发工程师根据Cocos2D-X 最新版本撰写,Cocos2D-X创始人王哲、CSDN创始人蒋涛联袂推荐 完全通过真实游戏案例驱动,不仅将Cocos2D-X的各种功能、原理、技巧融入其中,而且还详细讲解了空战类、塔防类、...
cocos2d-x-2.1.5
精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发 精通COCOS2D-X游戏开发
cocos2d-x游戏实例-纵版射击游戏 详见我的csdn博客http://blog.csdn.net/bill_man
在使用cocos2d-x开发游戏的过程中,为了实现逻辑和显示相分离。 在下通宵了一个晚上,写出了该事件类。 谨记,该事件只能用于cocos2d-x中。 事件发送者需要继承EventDispatcher类 事件接收者需要继承EventHandle类...
原始下载源码:http://download.csdn.net/detail/bill_man/4195629,该源码在2.0.x版本下编译错误。 本人提交源码进行了版本移植并修改了一个bug,目前使用VS2008...希望能给初学cocos2d-x进行游戏开发的朋友有所帮助。
源代码——Cocos2d-x高级开发教程源代码——Cocos2d-x高级开发教程源代码——Cocos2d-x高级开发教程源代码——Cocos2d-x高级开发教程
Cocos2d-x 3.x游戏开发实战pdf含目录,内容详细,强烈推荐给大家。
Cocos2d-x-3.x游戏开发之旅-钟迪龙著 全新pdf版和附书代码(代码为工程文件,可复制) 附带目录标签
本光盘是《Cocos2d-x游戏开发实战精解》一书的配书光盘,内容介绍如下。 (1)本书教学视频:该文件夹收录了本书的配套多媒体教学视频,可用暴风影音等视频播放器播放。 (2)本书源文件:该文件夹收录了本书涉及...
Cocos2d-x高级开发教程:制作自己的《捕鱼达人》 图书简介: 《Cocos2d-x高级开发教程:制作自己的《捕鱼达人》》是国内第一本全面深入讲解Cocos2d-x进阶内容的图书,Cocos2d-x创始人王哲作序推荐,《捕鱼达人》开发...
精通Cocos2d-x游戏开发(进阶卷)源代码 精通Cocos2d-x游戏开发(进阶卷)源代码 精通Cocos2d-x游戏开发(进阶卷)源代码
cocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML文件读取与骨骼动画.rarcocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML...
cocos2d-x-3.2下载,不多说。或者可以下载另一个资源 cocos引擎老版本集合(cocos2d-x-2.2.1 - 3.5) http://download.csdn.net/download/crazymagicdc/9982656