如何制作一个基于Tile的游戏 2 Cocos2d-x 2 0 4
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
在第一篇《如何制作一个基于Tile的游戏》基础上,增加碰撞和拾取功能,原文《Collisions and Collectables: How To Make a Tile-Based Game with Cocos2D Part 2》,在这里继续以Cocos2d-x进行实现。有关源码、资源等在文章下面给出了地址。
步骤如下:
1.使用上一篇的工程;
2.打开Tiled Map Editor工具,菜单栏→"图层"→"添加图层",命名为"Meta"。这个层,我们将放入一些假的tile来代表"特殊tile"。菜单栏→"地图"→"新图块",点击"浏览",选择"Resources"目录下的meta_tiles.png文件,边距和间距设置成1像素点,点击"确定"。可以看到在"图块"窗口新增了一页,里面有红色和绿色两种tile,如下图所示:
3.确认"Meta"层被选中,选择工具栏上"图章刷",选择红色tile,绘制可碰撞区域,完成之后,大概如下图所示:
需要给这个tile设置属性来标识它,这样才能知道该tile具有碰撞属性。在"图块"窗口,右键红色tile,选择"图块属性",新建一个属性,名称为"Collidable",其值为"true",如下图所示:
点击"确定"。保存地图。
4.打开HelloWorldScene.h文件,添加如下声明:
1
|
CC_SYNTHESIZE_RETAIN(cocos2d::CCTMXLayer*, _meta, Meta);
|
在HelloWorldScene.cpp文件构造函数里,添加代码:
1
|
_meta = NULL;
|
在init函数里,添加背景之后,添加如下代码:
1
2 |
this->setMeta(_tileMap->layerNamed("Meta"));
_meta->setVisible(false); |
这里把Meta层隐藏起来了,因为这只是作为阻挡的,不是真实可见的。添加一个新的方法,代码如下:
1
2 3 4 5 6 |
CCPoint HelloWorld::tileCoordForPosition(CCPoint position)
{ int x = position.x / _tileMap->getTileSize().width; int y = ((_tileMap->getMapSize().height * _tileMap->getTileSize().height) - position.y) / _tileMap->getTileSize().height; return ccp(x, y); } |
这个方法将坐标转换成tile坐标,tile坐标系如下图所示:
修改setPlayerPosition函数,代码如下:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void HelloWorld::setPlayerPosition(CCPoint position)
{ CCPoint tileCoord = this->tileCoordForPosition(position); int tileGid = _meta->tileGIDAt(tileCoord); if (tileGid) { CCDictionary *properties = _tileMap->propertiesForGID(tileGid); if (properties) { const CCString *collision = properties->valueForKey("Collidable"); if (collision && collision->compare("true") == 0) { return; } } } _player->setPosition(position); } |
在这里,我们将坐标转成tile坐标,获得这个tile坐标上的GID,再根据GID得到的属性字典,查找是否"Collidable"属性为"true",如果是则直接返回。
5.编译运行,可以看到忍者不能穿过红色区域了。如下图所示:
6.动态修改Tiled地图。我们为忍者增加可以吃的东西,比如这里的西瓜。创建一个可拾取的前景层,当忍者从tile拾取东西时,就把这个tile从前景层中移除。菜单栏→"图层"→"添加图层",命名为"Foreground"。注意,若是之前有在"Background"层绘制过西瓜的,需要用底图块,比如这里的沙漠块填充覆盖,以免达不到吃西瓜的效果。然后,选中"Foreground"层,选择西瓜tile块,在地图上进行绘制。如下图所示:
为西瓜标识可拾取。选择"Meta"层,图块切换到"meta_tiles"页,选择绿色tile,绘制到地图上西瓜tile区域。需要先把"Meta"层前置,点击菜单栏→"图层"→"前置图层",确保"Meta"层在最上层。如下图所示:
在"图块"窗口,右键绿色tile块,选择"图块属性",新建一个属性,名称为"Collectable",其值为"true"。点击"确定"。保存地图。
7.打开HelloWorldScene.h文件,添加如下声明:
1
|
CC_SYNTHESIZE_RETAIN(cocos2d::CCTMXLayer*, _foreground, Foreground);
|
在HelloWorldScene.cpp文件构造函数里,添加代码:
1
|
_foreground = NULL;
|
在init函数里,添加背景之后,添加如下代码:
1
|
this->setForeground(_tileMap->layerNamed("Foreground"));
|
在setPlayerPosition函数检测"Collidable"属性之后,添加检测"Collectable"属性,代码如下:
1
2 3 4 5 6 |
const CCString *collectable = properties->valueForKey("Collectable");
if (collectable && collectable->compare("true") == 0) { _meta->removeTileAt(tileCoord); _foreground->removeTileAt(tileCoord); } |
8.编译运行,可以看到忍者把西瓜吃掉了,如下图所示:
9.创建计分器。为忍者记录所吃西瓜的数量。我们创建一个新层HelloWorldHud来显示分数。在HelloWorldScene.h文件中,添加如下代码:
1
2 3 4 5 6 7 8 |
class HelloWorldHud : public cocos2d::CCLayer
{ public: virtual bool init(); CREATE_FUNC(HelloWorldHud); void numCollectedChanged(int numCollected); cocos2d::CCLabelTTF *lable; }; |
在HelloWorldScene.cpp文件中,进行实现,代码如下:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
bool HelloWorldHud::init()
{ bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); CCSize winSize = CCDirector::sharedDirector()->getWinSize(); return bRet; void HelloWorldHud::numCollectedChanged(int numCollected) |
接下去在HelloWorld类,添加HelloWorldHud层指针,在HelloWorldScene.h文件中HelloWorld类里,添加如下代码:
1
2 |
CC_SYNTHESIZE(int, _numCollected, NumCollected);
CC_SYNTHESIZE_RETAIN(HelloWorldHud*, _hud, Hud); |
在HelloWorldScene.cpp文件HelloWorld类构造函数里,添加代码:
1
2 |
_numCollected = 0;
_hud = NULL; |
在scene()函数里,添加如下代码:
1
2 3 4 |
HelloWorldHud *hud = HelloWorldHud::create();
scene->addChild(hud); layer->setHud(hud); |
在setPlayerPosition函数,检测到"Collectable"属性为"true"时,添加如下代码:
1
2 |
_numCollected++;
_hud->numCollectedChanged(_numCollected); |
10.编译运行,现在可以看到右下角有一个西瓜计分器,如下图所示:
11.增加音效和音乐。在HelloWorldScene.cpp文件HelloWorld类init函数里,添加如下代码:
1
2 3 4 |
CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("pickup.wav");
CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("hit.wav"); CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("move.wav"); CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("TileMap.wav"); |
在setPlayerPosition函数,检测到"Collidable"属性为"true",添加如下代码:
1
|
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("hit.wav");
|
检测到"Collectable"属性为"true",添加如下代码:
1
|
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("pickup.wav");
|
在设置玩家坐标前,添加如下代码:
1
|
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("move.wav");
|
12.编译运行,现在忍者的行动将有配乐,效果图:
参考资料:
1.Collisions and Collectables: How To Make a Tile-Based Game with Cocos2D Part 2 http://www.raywenderlich.com/1186/collisions-and-collectables-how-to-make-a-tile-based-game-with-cocos2d-part-2
2.碰撞与拾取:如何使用Cocos2D制作一款基于tile的游戏第2部分 http://www.raywenderlich.com/zh-hans/19250/%E7%A2%B0%E6%92%9E%E4%B8%8E%E6%8B%BE%E5%8F%96%EF%BC%9A%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8cocos2d%E5%88%B6%E4%BD%9C%E4%B8%80%E6%AC%BE%E5%9F%BA%E4%BA%8Etile%E7%9A%84%E6%B8%B8%E6%88%8F%E7%AC%AC2
3.(译)碰撞检测和收集物品:如何使用cocos2d制作基于tiled地图的游戏:第二部分 http://www.cnblogs.com/zilongshanren/archive/2011/05/03/2033620.html
非常感谢以上资料,本例子源代码附加资源下载地址:http://download.csdn.net/detail/akof1314/4983778
如文章存在错误之处,欢迎指出,以便改正。
给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
如何制作一个基于Tile的游戏 2 Cocos2d-x 2 0 4相关推荐
- 如何制作一个基于Tile的游戏 Cocos2d-x 2 0 4
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...
- 如何制作一个横版格斗过关游戏 2 Cocos2d x 2 0 4
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在第一篇 ...
- 使用小程序制作一个飞机大战小游戏
此文主要基于微信小程序制作一个飞机大战小游戏,上手即用,操作简单. 一.创建小程序 二.页面实现 三.代码块 一.创建小程序 访问微信公众平台,点击账号注册. 选择小程序,并在表单填写所需的各项信息进 ...
- python turtle 画老鼠,python用turtle制作一个猫捉老鼠游戏
CSDN网友写的猫捉老鼠游戏代码 看着不错 大家借鉴一下 import turtle import time import random def up(): jerry.setheading(90) ...
- 基于C#制作一个飞机大战小游戏
此文主要基于C#制作一个飞机大战游戏,重温经典的同时亦可学习. 实现流程 1.创建项目 2.界面绘制 3.我方飞机 4.敌方飞机 5.子弹及碰撞检测 实现流程 1.创建项目 打开Visual Stud ...
- 微信小程序|使用小程序制作一个足球拼图小游戏
世界杯的意义永远不止是冠军,它是每个精彩的瞬间,是呐喊,是青春.此文用小程序制作一个足球的拼图小游戏,一起为世界杯疯狂吧! 开发步骤 一.工具安装 二.功能实现 1 . 提示图展示 2 . 绘制画布内 ...
- 100行代码,使用 Pygame 制作一个贪吃蛇小游戏!
作者 | 周萝卜 来源 | 萝卜大杂烩 相信我们大家都玩过贪吃蛇游戏,今天我们就从头一起来写一个贪吃蛇小游戏,只需要100多行的代码就完成了. 用到的 Pygame 函数 贪吃蛇小游戏用到的函数 功能 ...
- wp7使用Cocos2d-X for XNA制作一个塔防类游戏 (二)在游戏中加入地图和怪物。(上)
地图编辑器的使用 首先先来介绍一下使用地图编辑器tIDE Tile Map Editor来生成TMX文件.tIDE Tile Map Editor的下载地址 http://tide.codeplex ...
- html5制作端午节游戏,意派Epub360怎么制作一个端午节H5小游戏页面?
六月已经过了三分之一,"粽子节"也马上要到了,每当这时候,又到新媒体运营人和设计师头秃的时刻,在传统的节日里,如何把传统的节日使用互联网元素表现,让更多的年轻人能够参与进来,H5这 ...
最新文章
- ESX VMFS文件系统浏览及修复软件部分免费发布
- 算法笔记-图--bfs
- Silverlight+WCF 新手实例 象棋 WCF通讯跨域(十五)
- 【HTML+CSS练习】画一个条件查询
- 腾讯+字节+阿里面经真题汇总,Android篇
- python基础-第三篇-函数编程
- 某合资源网4.5主题 完美无错版 emlog模板
- 一步一步学Ruby(二):变量,常量
- python可变类型与不可变类型作为函数参数区别_不要用可变类型对象做函数默认参数...
- 企业应该了解的ISO27001体系建设指导
- appium和airtest_Airtest自动化测试工具
- 打印机 树莓派安装cpus_raspberry树莓派安装CUPS实现打印服务器共享HP P1007打印机...
- 电脑计算机未输出任何信号 键盘没亮,戴尔计算机不显示信号,为什么计算机屏幕不显示...
- CAD图纸打印出来后很多CAD文字消失了怎么办?
- java自动机字符串匹配_【算法】利用有限自动机进行字符串匹配
- 计算机逻辑与 或 非的表达式,逻辑表达式
- 怎么给图片加水印?四个操作步骤
- 消息称聊天宝团队解散 罗永浩已经退出股东行列
- 城市系统应用其一-表征城市交通模式
- 计算机音乐文爱图片,CG/贺敬轩《文爱》[FLAC/MP3-320K]
热门文章
- Hibernate初学者教程
- OSPF——GRE Tunnel(含配置命令)详解
- C语言,向函数传递一维数组,调用函数并计算平均成绩
- python 字符串格式化语法_Python:字符串格式化
- 【Python】五子棋项目记录
- C语言究竟是一门怎样的语言?
- C#LeetCode刷题之#559-N叉树的最大深度​​​​​​​(Maximum Depth of N-ary Tree)
- C#LeetCode刷题之#168-Excel表列名称(Excel Sheet Column Title)
- C#LeetCode刷题之#119-杨辉三角 II(Pascal‘s Triangle II)
- 兔子运送胡萝卜_我如何建立和运送第一个MVP