cocos2d-x Tiled地图坐标转换
2016-04-27 10:12
387 查看
一、地图坐标
Tiled地图一般常见的有3种不同的地图类型,即:普通、45度、45度交错,但是在所有类型的地图中的坐标都是按格子数算的,比如坐标(0,0)代表左上角的第一个格子,需要注意的是,由于3种类型地图的视角不同,所以坐标的起始与分布也有点差别,具体看下面几张图就明白了:
1、普通直角地图坐标
![](https://img-blog.csdn.net/20150321144810003?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTc4NzExOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2、45度地图坐标
![](https://img-blog.csdn.net/20150321144833387?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTc4NzExOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3、45度交错地图坐标
![](https://img-blog.csdn.net/20150321144918128?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTc4NzExOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
二、地图锚点
tiled地图的锚点默认的是在左下角,也就是opengl坐标系的(0,0)点,每一个瓦块的锚点也是如此,同样需要注意的是3种不同类型地图的锚点位置会因为视角的不同而有所差别,详见下面几张图:
1、普通直角地图锚点
![](https://img-blog.csdn.net/20150321145005711?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTc4NzExOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2、45度地图锚点
![](https://img-blog.csdn.net/20150321144950014?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTc4NzExOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3、45度交错地图锚点
![](https://img-blog.csdn.net/20150321145003446?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTc4NzExOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
三、坐标转换
很明显,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、普通直角地图坐标转换
// 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度交错地图坐标转换
// 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); }
相关文章推荐
- 百度地图经纬度转换到腾讯地图/Google 对应的经纬度
- Windows下C#的GUI窗口程序中实现调用Google Map的实例
- iOS开发之离线地图核心代码
- 基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
- 在Google 地图上实现做的标记相连接
- PHP计算百度地图两个GPS坐标之间距离的方法
- sogou地图API用法实例教程
- 使用OpenLayers3 添加地图鼠标右键菜单
- cocos2dx骨骼动画Armature源码剖析(一)
- cocos2dx骨骼动画Armature源码剖析(二)
- 剖析iOS开发中Cocos2d-x的内存管理相关操作
- 详解iOS游戏开发中Cocos2D的坐标位置关系
- Python和Perl绘制中国北京跑步地图的方法
- iOS 5 cocos2d 游戏开发 3ff8 实战:第4章 你的第一个游戏
- quick-cocos2d-x for mac开发环境安装配置
- 阅读 KBEngine 要理清的问题
- KBEngine 编译、运行、调试
- KBEngine Cocos2d JS 客户端启动过程
- KBEngine 客户端-loginapp-协议加载
- iOS 高德地图(-)(基础篇)