用cocos tiledmap2dx 加C++ 制作战棋游戏,怎么结合TILED进行障碍设置

Cocos2dx 学习笔记(3) ---- 瓦片地图加载与触摸控制 - 推酷
Cocos2dx 学习笔记(3) ---- 瓦片地图加载与触摸控制
昨天完成了自定义类和脚本导出,今天假设场景结构,并加载TMX地图,实现地图拖动和点选的功能.
1. 用Tiled地图编辑器做一张简单的地图,如下图:
2. 将地图文件和地块纹理加入到资源目录.
CCTMXTiledMap由CCTMXLayer组成,而CCTMXLayer是批量渲染节点,所以没办法所复杂纹理的运用.
CCTMXTiledMap在类的头文件已经说明了,每一层Layer只能够有一张瓦片纹理,这就限制了虽然CCTMXTiledMap有很多层,但是无法作为复杂对象所在的层,还是专门做地图和区域标记的好.
在我的设计中,主场景设定了多层Layer,CCTMXTiledMap看做一层,视为地面层(包括地下水层),而地上对象,天空等后续增加,与CCTMXTiledMap并列,没有包含关系.
CCTMXTiledMap是一个灵活的地图容器,没有因为朝向的不同而被设计成不同的实现类,所以我在设计场景控制器的时候是选择分开的,根据朝向来创建不同的控制器,因为控制器到后来会内容会非常庞杂.
具体设计如下:
CMainScene: 主场景,支持多层,脚本导出
IsometricController: 等轴模式场景控制器,用来控制地图拖拽,点击,拣选等操作,主要的逻辑触发点.
一. 主场景类
// -------------------------------------------------------
// 文件名: MainScene.h
述: 主场景
期: 11/3/2013
者: KevinYuen
权: Copyright (C) 2011 - All Rights Reserved
// -------------------------------------------------------
#ifndef _MAINSCENE_H_
#define _MAINSCENE_H_
#include &cocos2d.h&
USING_NS_CC;
typedef enum
ESLT_GROUND, // 地面
ESLT_OBJECT1, // 对象层
ESLT_OBJECT2, // 对象层
ESLT_OBJECT3, // 对象层
ESLT_CONTROL, // 控制层
ESLT_FORCE32 = 0x7FFFFFFF
} EnSceneLayerT
class CMainScene : public CCScene
// 析构函数
~CMainScene();
// 加载场景
bool loadScene( const char* tmx_file );
// 卸载场景
bool unloadScene();
protected:
// 加载地图
bool loadMap( const char* map_file );
// 静态create方法实现
CREATE_FUNC( CMainScene );
#include &MainScene.h&
#include &IsometricController.h&
// 析构函数
CMainScene::~CMainScene()
// 加载场景
bool CMainScene::loadScene( const char* tmx_file )
// 进行加载
CCLOG( &[CMainScene] Prepare load scene from: %s.&, tmx_file );
// 首先卸载当前场景
if( !unloadScene() )
CCLOG( &[CMainScene] unload old scene failed.& );
// 加载地图
if( !loadMap( tmx_file ) )
CCLOG( &[CMainScene] create map filed. map file: %s.&, tmx_file );
// 添加控制层
CCTMXTiledMap* pMap = dynamic_cast&CCTMXTiledMap*&( getChildByTag( ESLT_GROUND ) );
if( pMap )
switch( pMap-&getMapOrientation() )
case CCTMXOrientationIso: // 等轴视距模式
CIsometricController* pCtrl = CIsometricController::create();
pCtrl-&bindScene( this );
addChild( pCtrl, 0, ESLT_CONTROL );
case CCTMXOrientationOrtho:
case CCTMXOrientationHex:
CCLOG( &[CMainScene] unknown map orientation: %n.&, pMap-&getMapOrientation() );
// 后续层扩展
// 卸载场景
bool CMainScene::unloadScene()
CCLOG( &[CMainScene] Prepare unload tilemap.& );
// 卸载该层所有子节点
removeAllChildrenWithCleanup( true );
// 加载地图
bool CMainScene::loadMap( const char* map_file )
CCLOG( &[CMapLayer] Prepare load tilemap from: %s.&, map_file );
// 加载一个新的瓦片地图场景节点(TMX是一种瓦片地图的保存格式)
CCTMXTiledMap *map = CCTMXTiledMap::create( map_file );
if( !map )
CCLOG( &[CMapLayer] load tilemap failed, please check file: %s.&, map_file );
// 添加进地形层
addChild( map, 0, ESLT_GROUND );
#ifdef _DEBUG
// 输出新地图的基本信息
CCLOG( && );
CCLOG( &********************* new tmx tile map info ********************& );
// 原始尺寸
CCSize conSize = map-&getContentSize();
CCLOG( &[CMapLayer] Content size: %.2f, %.2f.&, conSize.width, conSize.height );
// 瓦片排布
CCSize mapSize = map-&getMapSize();
CCLOG( &[CMapLayer] Map size: %.2f, %.2f.&, mapSize.width, mapSize.height );
// 瓦片尺寸
CCSize tilSize = map-&getTileSize();
CCLOG( &[CMapLayer] Tile size: %.2f, %.2f.&, tilSize.width, tilSize.height );
// 地图对象信息
CCArray* pChildren = map-&getChildren();
if( pChildren )
int nLayerCount = 0;
int nObjectTotalCount = 0; // 总的对象数
CCObject* pObj = NULL;
CCARRAY_FOREACH( pChildren, pObj )
++nObjectTotalC
CCTMXLayer* layer = dynamic_cast&CCTMXLayer*&(pObj);
if( layer )
CCLOG( &[CMapLayer] TMX Layer: name:%s.&, layer-&getLayerName() );
CCLOG( &[CMapLayer] Total object count: %d.&, nObjectTotalCount );
CCLOG( &[CMapLayer] Total mtx layer count: %d.&, nLayerCount );
// 对象组信息
CCArray* pGroups = map-&getObjectGroups();
if( pGroups && pGroups-&count() & 0 )
CCTMXObjectGroup* pObjectGroup = NULL;
CCObject* pObj = NULL;
CCARRAY_FOREACH( pGroups, pObj )
pObjectGroup = dynamic_cast&CCTMXObjectGroup*&( pObj );
if( pObjectGroup )
CCLOG( &[CMapLayer] Object group: name: %s.&, pObjectGroup-&getGroupName() );
CCLOG( && );
// 对地图节点设定位置
map-&setPosition( 0, 0 );
$#include &../Scene/MainScene.h&
typedef enum
ESLT_GROUND, // 地面
ESLT_OBJECT1, // 对象层
ESLT_OBJECT2, // 对象层
ESLT_OBJECT3, // 对象层
ESLT_CONTROL, // 控制层
ESLT_FORCE32 = 0x7FFFFFFF
} EnSceneLayerT
class CMainScene : public CCScene
// 加载场景
bool loadScene( const char* tmx_file );
// 卸载场景
bool unloadScene();
// 静态create方法实现
static CMainScene* create();
& 二. 控制类
// -------------------------------------------------------
// 文件名: IsometricController.h
述: 等轴视距控制器
期: 11/3/2013
者: KevinYuen
权: Copyright (C) 2011 - All Rights Reserved
// -------------------------------------------------------
#ifndef _ISOMETRICCONTROLLER_H_
#define _ISOMETRICCONTROLLER_H_
#include &cocos2d.h&
USING_NS_CC;
class CIsometricController : public CCLayer
~CIsometricController();
virtual bool init();
// 进入(所属场景被设置为当前运行场景时调用)
virtual void onEnter();
// 销毁(所属场景被从当前运行场景取下时调用)
virtual void onExit();
// 静态create方法实现
CREATE_FUNC( CIsometricController );
// 绑定场景
void bindScene( CCScene* scene );
// 获取绑定场景
CCScene* getScene()
protected:
// 注册事件监听
void registerWithTouchDispatcher( void );
// 触摸拖动
virtual void ccTouchesMoved( CCSet *pTouches, CCEvent *pEvent );
// 触摸开始
virtual bool ccTouchBegan( CCTouch *pTouch, CCEvent *pEvent );
// 触摸结束
virtual void ccTouchEnded( CCTouch *pTouch, CCEvent *pEvent );
// 构造函数
CIsometricController();
CCScene* m_pBindS // 绑定场景
#include &IsometricController.h&
#include &MainScene.h&
// 构造函数
CIsometricController::CIsometricController(): m_pBindScene( NULL )
CIsometricController::~CIsometricController()
bool CIsometricController::init()
bool ret = CCLayer::init();
if( !ret )
// 代码添加预留
// 进入(所属场景被设置为当前运行场景时调用)
void CIsometricController::onEnter()
CCLayer::onEnter();
// 设置响应触摸
setTouchEnabled( true );
// 销毁(所属场景被从当前运行场景取下时调用)
void CIsometricController::onExit()
// 解除场景绑定
bindScene( NULL );
// 设置响应触摸
setTouchEnabled( false );
CCLayer::onExit();
// 绑定场景
void CIsometricController::bindScene( CCScene* scene )
m_pBindScene =
// 获取绑定场景
CCScene* CIsometricController::getScene() const
return m_pBindS
// 注册事件监听
void CIsometricController::registerWithTouchDispatcher( void )
CCDirector::sharedDirector()-&getTouchDispatcher()-&addTargetedDelegate( this, 0, false );
CCLayer::registerWithTouchDispatcher();
// 获取指定节点坐标的地块索引
// 方法来自网络
CCPoint tilePosFromLocation( const CCPoint& location, CCTMXTiledMap* tileMap )
// Tilemap position must be subtracted, in case the tilemap position is scrolling
CCPoint pos = ccpSub(location, tileMap-&getPosition() );
float halfMapWidth = tileMap-&getMapSize().width * 0.5f;
float mapHeight = tileMap-&getMapSize().
float tileWidth = tileMap-&getTileSize().
float tileHeight = tileMap-&getTileSize().
CCPoint tilePosDiv = CCPointMake(pos.x / tileWidth, pos.y / tileHeight);
float inverseTileY = mapHeight - tilePosDiv.y;
// Cast to int makes sure that result is in whole numbers
float posX = (int)(inverseTileY + tilePosDiv.x - halfMapWidth);
float posY = (int)(inverseTileY - tilePosDiv.x + halfMapWidth);
// make sure coordinates are within isomap bounds
posX = MAX(0, posX);
posX = MIN(tileMap-&getMapSize().width - 1, posX);
posY = MAX(0, posY);
posY = MIN(tileMap-&getMapSize().height - 1, posY);
return CCPointMake(posX, posY);
// 触摸拖动
void CIsometricController::ccTouchesMoved( CCSet *pTouches, CCEvent *pEvent )
CCTouch *touch = (CCTouch*)pTouches-&anyObject();
CCPoint diff = touch-&getDelta();
CCTMXTiledMap* pTmxMap = dynamic_cast&CCTMXTiledMap*&( m_pBindScene-&getChildByTag( ESLT_GROUND ) );
if( pTmxMap )
CCPoint currentPos = pTmxMap-&getPosition();
pTmxMap-&setPosition( ccpAdd(currentPos, diff) );
// 触摸开始
bool CIsometricController::ccTouchBegan( CCTouch *pTouch, CCEvent *pEvent )
// 这里必须返回真,才会有后续的Move和End消息
// 触摸结束
void CIsometricController::ccTouchEnded( CCTouch *pTouch, CCEvent *pEvent )
if( !m_pBindScene )
CCPoint touchLocation = convertTouchToNodeSpace( pTouch );
// 检测是否有TMX瓦块地图
CCTMXTiledMap* pTmxMap = dynamic_cast&CCTMXTiledMap*&( m_pBindScene-&getChildByTag( ESLT_GROUND ) );
if( pTmxMap )
CCTMXLayer* layer = pTmxMap-&layerNamed(&ground&);
CCSprite* sprite = layer ? layer-&tileAt( tilePosFromLocation( touchLocation, pTmxMap ) ) : NULL;
if( sprite )
sprite-&setVisible( false );
& 三. 脚本调用
与上章不同,我重新创建了一个新的脚本,抛弃模版例子,命名为main.lua.
--------------------------------------------------------
--文件名: main.lua
述: 主脚本
期: 11/3/2013
者: KevinYuen
权: Copyright (C) 2011 - All Rights Reserved
---------------------------------------------------------
-- 跟踪绑定执行函数发生错误的信息并输出
function __G__TRACKBACK__(msg)
print(&----------------------------------------&)
print(&LUA ERROR: & .. tostring(msg) .. &\n&)
print(debug.traceback())
print(&----------------------------------------&)
local function main()
-- 创建主场景
local scene = CMainScene:create();
if not scene then
print( &Create main scene failed!& );
-- 加载测试场景
-- 引擎对CCTMXTiledMap有限制,每一层只能有一个瓦块包,也就是一张纹理
if not scene:loadScene( &TilesMap/Isotile_2.tmx& ) then
print( &Load tilemap failed!& );
-- 设定为当前场景并执行
CCDirector:sharedDirector():runWithScene( scene );
-- 执行脚本函数并捕获错误信息
-- 函数原型: xpcall( 调用函数, 错误捕获函数 );
xpcall(main, __G__TRACKBACK__)
下一步会增加对象层,实现场景对象的添加 :)
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致cocos2dx动画_视频在线观看_百度视频
cocos2dx动画相关视频:
大家都在搜:
百度视频搜索结果源于互联网视频网站,系计算机系统根据搜索热度自动排列,不代表百度赞成被搜索网站的内容或立场。cocos2dx吧_百度贴吧
签到排名:今日本吧第个签到,
本吧因你更精彩,明天继续来努力!
本吧排名:
本吧签到人数:176
可签7级以上的吧50个
本月漏签0次!
成为超级会员,赠送8张补签卡
连续签到:天&&累计签到:天
超级会员单次开通12个月以上,赠送连续签到卡3张
一个支持多平台的2D手机游戏引擎
1、《二战英雄》 2、《终结者》 3、《神战谷果》 4、《僵尸大作战》 5、《血战太平洋》 下载地址在楼下
如图,求大神指点,在线等 急急急
cocos2dx-北风cocos2d课程学费低廉,按需学习,数10万学员口碑好,随到随学,灵活,方便,..
应聘一个公司要求我边学边干 做一个棋牌游戏 越快越好 我之前学过安卓 初级水平 我打算看极客学院的视频 结合cocos官网 大家可以给我点意见吗 我现在
都是个人开发的手机游戏~电脑游戏,都附教程,都是用coocs2dx还有unity3d这两个最主流的引擎开发的,教
第一章 Lua 语言基础 1、Lua语言介绍 2、Lua语言基础之基本语法 3、Lua语言基础之表 4、Lua语言基础之数组 5
出一套手机联网捕鱼和牛牛源码。另外再出一套手机联网扎金花,大转盘,老虎机源码。前端都是cocos。后
找了好久啊谁发一个谢谢了
官网那个cocos creator表示不会用,更像是设计师用的,不适合码农啊,本来想用ldt搭建,但是环境怎么配置
本人某宝五十buy的,现五块 出。各大网站的资料
请问下 .jsc文件能被什么工具打开吗?
艺术生大四毕设给自己挖的坑 填不了了 老师说可以用cocos creator做 然而发现没有多少教程。老师又推荐可
淘宝网cocos2dx 按钮,众多热销爆款,商家比价,淘选实惠!淘宝数码,智享生活,淘,你喜欢!
本人cocos2dx三年开发经验,目前在公司助理主程职位,但是做的主程的活。大家有什么疑问可以留言,我尽
这是大神们制作的chm文档免费下载:http://download.csdn.net/detail/qijishjie32/9380398
视频资源 coco-x3.x 、c、cocos2d-js 等的基础视频教程 极客学院的 ,希望能帮助到别人 我也是一个初学者,以前总是获取,感谢那些无私奉献的人,特发
Cocos2d-x跨平台手机游戏开发配4个项目(引擎应用,单点和多点触摸、瓦片地图、骨骼动画) 用到技术:cocos2d-x引擎、单点和多点触摸、瓦片地图、骨骼动
珠江新城绝佳位置,待遇从优,加入公司一起拼搏创造奇迹! 如果有团队不想来上班也可以以项目合作,
自学了一段时间,基本的cocos2d-x内容都会,就是现在招人都不要实习生的么
从网上找的代码 自己创建了cocos2dx工程 替换了class和resource文件夹 编译会出现LNK2019错误。。怎么办
我想购买cocos2dx小游戏,最好十分简单的啦,大家有没有可以共享的小游戏呀,价钱可以聊
最近从win10转战ubunu,对linux系统并没有很深刻的了解,在百度上查到的资料都是关于如何在linux下搭建cocos
要做个俯视角度人物移动。碰到墙总是会反弹,restitution设置成0了还是反弹,什么垃圾引擎
// Cocos2dx C++ 代码 // Lua脚本 在引擎跳转执行Lua脚本之后,Lua无法调用库函数 如上图所示: require 、 collectga
想购买一个cocos2dx的小游戏,越简单越好
为什么我在创建项目cocos new的时候它总是提示“new”有错误?
下载地址 百度云盘:/s/1gemYLl5 (如有链接失效、请跟帖回复、我会第一时间看到、或者联
Cocos2d-x实战课程《泰斗魔兽卡牌》教程要的吧友加 QQ1 3 2 2 6 7 7 0 53
本人本科,贫二代,内向,毕业找工作,因为没钱去干普工存钱准备找好一点工作,然而因为找工作又要
新人求问:今天看书的时候根据书上的内容使用Scale9Sprite , 但是书上说要引入一个libExtensions.vcxproj文件,我怎么也找不到该文件。 然后我在网上
翻了大半天百度没找到
加载到cocos2dx后有乱码
1.专科以上学历; 2.半年以上手游研发经验; 3.精通C++,熟悉COCOS2D-X引擎; 4.工作地点在杭州余杭美亚大厦
刚接触Cocos不久,求助一下 怎么消除父节点Scale操作对其所有子节点中的其中一个子节点的影响,就是说:
国内专业手游开发广西尚讯网络科技有限公司 著作权归作者所有,转载请联系作者获得授权。
求大神解决一下
cocos creator的
来个大神给我说说吧!!!怎么做啊?我用for循环创建了几个精灵,在循环的同时给每一个精灵都添加了
大神们谁能帮我做个cocos creator的游戏 越简单越好 必将重谢
#include &Scene.h& USING_NS_CC; Scene* MyWorld::createScene() { auto scene = Scene::create(); auto layer = MyWorld::create(); sce
然后又用ADT虚拟机测试看,用adt-stack检测,出现: Crash dump is completed ********** Crash dump: ********** Build fingerprint: 'generic/s
你可能感兴趣的吧...
发贴红色标题
签到六倍经验
兑换本吧会员
赠送补签卡1张,获得
助攻总额: 43W
贴吧热议榜
使用签名档&/ wxsqlite3_cocos2dx
项目语言:C++
wxsqlite3_cocos2dx/
00:50:10 +0800 (Thu, 20 Nov 2014)
(C)&&2013&&Alibaba&&Inc.&&All&&rights&&resvered.
Powered by

我要回帖

更多关于 cocos2dx 战棋 的文章

 

随机推荐