cocos2d-x-Tiled 地图坐标 转换
2015-07-14 09:46
1251 查看
一、地图坐标
Tiled地图一般常见的有3种不同的地图类型,即:普通、45度、45度交错,但是在所有类型的地图中的坐标都是按格子数算的,比如坐标(0,0)代表左上角的第一个格子,需要注意的是,由于3种类型地图的视角不同,所以坐标的起始与分布也有点差别,具体看下面几张图就明白了:
1、普通直角地图坐标
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/09/790c7ef4733e795852f63b44b4d8a19d)
2、45度地图坐标
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/09/e0fce85f553c7cb74483fd27b1c8ba7f)
3、45度交错地图坐标
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/09/2f629b28c83516f6b7a5ae737ccd28b4)
二、地图锚点
tiled地图的锚点默认的是在左下角,也就是opengl坐标系的(0,0)点,每一个瓦块的锚点也是如此,同样需要注意的是3种不同类型地图的锚点位置会因为视角的不同而有所差别,详见下面几张图:
1、普通直角地图锚点
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/09/522f95447fac35989341e58c767355b8)
2、45度地图锚点
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/09/fdf93870cad41b58c189dc4a1bc1654f)
3、45度交错地图锚点
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/09/71d203a7ea3b7be435ea1e1e802e3225)
三、坐标转换
很明显,tiled地图上的坐标不能直接用于在cocos的场景里,因为它们使用的坐标系是不一样的,所以如果要想正确的设置tiled地图坐标,必须对其坐标进行转换,关键代码如下(以下转换代码是基于坐标系对齐的情况下,即地图处在默认位置未移动,否则需要考虑加减地图坐标):
1、普通直角地图坐标转换
2、45度地图坐标转换
3、45度交错地图坐标转换
Tiled地图一般常见的有3种不同的地图类型,即:普通、45度、45度交错,但是在所有类型的地图中的坐标都是按格子数算的,比如坐标(0,0)代表左上角的第一个格子,需要注意的是,由于3种类型地图的视角不同,所以坐标的起始与分布也有点差别,具体看下面几张图就明白了:
1、普通直角地图坐标
2、45度地图坐标
3、45度交错地图坐标
二、地图锚点
tiled地图的锚点默认的是在左下角,也就是opengl坐标系的(0,0)点,每一个瓦块的锚点也是如此,同样需要注意的是3种不同类型地图的锚点位置会因为视角的不同而有所差别,详见下面几张图:
1、普通直角地图锚点
2、45度地图锚点
3、45度交错地图锚点
三、坐标转换
很明显,tiled地图上的坐标不能直接用于在cocos的场景里,因为它们使用的坐标系是不一样的,所以如果要想正确的设置tiled地图坐标,必须对其坐标进行转换,关键代码如下(以下转换代码是基于坐标系对齐的情况下,即地图处在默认位置未移动,否则需要考虑加减地图坐标):
1、普通直角地图坐标转换
[code]// OpenGL坐标转成格子坐标 Vec2 tileCoordForPosition(const Vec2& position) { Size mapSize = tiledMap->getMapSize(); Size tileSize = tiledMap->getTileSize(); int x = position.x / tileSize.width; int y = (mapSize.height*tileSize.height - position.y) / tileSize.height; return Vec2(x, y); } // tile坐标转成瓦片格子中心的OpenGL坐标 Vec2 positionForTileCoord(const Vec2& tileCoord) { Size mapSize = tiledMap->getMapSize(); Size tileSize = tiledMap->getTileSize(); int x = tileCoord.x * tileSize.width + tileSize.width/2; int y = (mapSize.height-tileCoord.y)*tileSize.height - tileSize.height/2; return Vec2(x, y); }
2、45度地图坐标转换
3、45度交错地图坐标转换
[code]// OpenGL坐标转成格子坐标 Vec2 staggeredCoordForPosition(CCPoint position) { Size mapSize = tiledMap->getMapSize(); Size tileSize = tiledMap->getTileSize(); int y = mapSize.height - 2 - ((2 * (int)position.y)/(int)tileSize.height); float x = position.x/tileSize.width - (y % 2)/2.0f; return Vec2(x, y); } // tile坐标转成瓦片格子中心的OpenGL坐标 Vec2 positionForStaggeredCoord(const Vec2& StaggeredCoord) { Size mapSize = tiledMap->getMapSize(); Size tileSize = tiledMap->getTileSize(); int x = StaggeredCoord.x*tileSize.width + ((int)StaggeredCoord.y%2)*tileSize.width/2; int y = (mapSize.height-(StaggeredCoord.y+1))*tileSize.height/2 - tileSize.height/2; return Vec2(x, y); }
相关文章推荐
- cocos2d-x 创建项目过程 -----1
- 【cocos2d-x 报错异常集】中断!0xC0000005: 读取位置 0x000001E8 时发生访问冲突。
- cocos2d.x单点触摸事件
- Cocos2d-x vector使用遇到问题。
- cocos2d-x 3.4 + android studio 1.1.0 + VS2012 开发环境搭建
- 【独立开发者er Cocos2d-x实战 007】使用Cocos2dx UserDefault.xml
- 【cocos2d-x 3.X自学笔记】[转]Eclipse配置安卓开发环境(解决SDK manager下载慢问题)
- 5、cocos2d-Lua的demo--虫子和虫子精灵
- 4、cocos2d-Lua的demo--游戏逻辑GameView
- 3、cocos2d-Lua的运行流程与场景
- 2、cocos2d-Lua创建示例demo
- 1、cocos2d-x Lua安装配置
- 【quick-cocos2d-x 游戏开发之一】开发工具sublime text及其强力插件QuickXDev
- cocos2dx之物理引擎
- Cocos3.0 的android返回键功能实现
- cocos2dx AssetsManager的一个BUG
- 如何优化cocos2d/x程序的内存使用和程序大小
- 使用Quick-Cocos2d-x开发植物大战僵尸03-游戏加载页面
- Cocos2dx------2048游戏
- Cocos2d-x的骨骼动画Spine和Armature