Cocos格子地图(2)
2016-04-16 14:39
453 查看
坐标转换
对格子地图的很多操作,尤其是对地图中特定格子的操作必须通过坐标转换完成。世界坐标转地图格子坐标:
auto ev =
EventListenerTouchOneByOne::create();
ev->onTouchBegan= [&](Touch*
touch, Event*)
{
/* 获取层*/
TMXLayer* layer =map->getLayer("Layer0");
/* 获取触摸位置 */
Vec2 ptTouch =
touch->getLocation();// ptTouch是世界坐标
Vec2 ptInMap =map->convertToNodeSpace(ptTouch); //将世界坐标转到节点坐标,但是是GL坐标
/* 计算格子位置 */
int x = ptInMap.x /map->getTileSize().width; //getTileSize获取每个格子的大小
int y = ptInMap.y /map->getTileSize().height;
y = map->getMapSize().height - 1 - y; //getMapSize获取格子地图的宽高格子数
/* 做个动作 */
Sprite* sprite =layer->getTileAt(Vec2(x, y));
sprite->runAction(JumpBy::create(5.0f,
Vec2(0, 0), 30, 10));
/* 获取该格子的groupID——也是在.tmx中定义的*/
uint32_t id =layer->getTileGIDAt(Vec2(x, y));
CCLOG("group id =%d", (int)id);
return
true;
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(ev,this);
编成函数:
/* 将地图的像素坐标转化成砖块坐标 */
Vec2 Map2Tile(TMXTiledMap*
map, Vec2
ptOfMap)
{
int x =
ptOfMap.x / map->getTileSize().width;
int y =
ptOfMap.y / map->getTileSize().height;
y = map->getMapSize().height- y - 1;
return
Vec2(x, y);
}
可以看出来,转换GL->格子坐标时,x就是x,不用变,但是y必须做一个修正转换,用y方向的格子数减去y再减1(因为是从0算起的)
关于GID,是格子在地图中的编号,一般从左上角开始算起,自1开始。
地图格子坐标转地图世界坐标:
/* 将砖块的坐标转化成地图的像素坐标,以砖块左下角为标准 */
Vec2 Tile2Map(TMXTiledMap*
map, Vec2
ptOfTile)
{
int x =
ptOfTile.x * map->getTileSize().width;
int y = (ptOfTile.y+1) *
map->getTileSize().height;
y = map->getContentSize().height- y;
return
Vec2(x, y);
}
参数1是格子地图,参数2是格子坐标,其返回的是在格子地图这个节点之下的“世界”坐标(GL坐标系)
这个函数其实就是前面的一个逆运算。
45度角地图
就是菱形地图——如传奇这种游戏,就是45度角地图。操作和正常地图一样的接口。要注意的是:尽管地图是菱形,但实际上组成地图的图片也是菱形,而不是方形图经过转换成的菱形。其map的getContentSize获取的也是一个个矩形块之和的像素宽高
45度角地图的宽高实际上都是以水平竖直计算的,同样用的是UI坐标系
坐标转换:我们通过菱形的中心来协助计算位置,这个比平面地图复杂
/* 将砖块的坐标转化成地图的像素坐标,以砖块左下角为标准 */
Vec2 Tile2Map45(TMXTiledMap*
map, Vec2
ptOfTile)
{
/* tile x = 0, map x= middle of contentSize
tile x = 1, map x = middle of contentSize + tilesize.width/2
tile x = 2, map x = middle of contentSize + tilesize.width/2 * 2
tile x = i, map x = midlle of contentSize + tilesize.width/2 * i
map x : map x - tilesize.width/2* tile.y */
int x =
map->getContentSize().width/ 2;
x += ptOfTile.x * (map->getTileSize().width/ 2);
x -= ptOfTile.y * (map->getTileSize().width/ 2);
int y = (ptOfTile.x +
ptOfTile.y + 1) * map->getTileSize().height / 2;
y = map->getContentSize().height- y;
return
Vec2(x, y);
}
相关文章推荐
- Cocos格子地图(1)
- cocos2dx的数据保存之UserDault
- cocos2dx+lua注册事件函数详解
- Cocos2d-x移植android增加震动效果
- cocos2d-lua 下使用protobuffer
- cocos2d_lua播放动画
- cocos2d-x自制工具07:打印cocos2d-x的节点树
- cocos2dx 压缩图片的网站/工具
- 个人初做小游戏RunRunMagic(五) 总结
- cocos模拟器已经启动 但是不能访问6010端口
- class() 高级用法 --cocos2dx- lua
- Cocos2dx 3.x的android studio项目之间.so库、资源移植
- cocos2d-x 3.x DrawNode的使用
- mac下创建cocos2d-x的android项目详细流程
- cocos2d-x3.0 macOS下配置Android开发环境以及使用cocos2d-console来新建执行project
- Cocos2d-x 3.0中 物理碰撞检测中onContactBegin回调函数不响应问题
- 骨骼动画中为每个骨骼设置单独的颜色
- cocos2dx CCArray
- cocos2dx抗锯齿与渲染冲突——待解决
- cocos2dx抗锯齿问题