您的位置:首页 > 移动开发 > Cocos引擎

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: