我想在程序内实时的修改TMXTileLayer中的tile,所以要用到setTileGID,但这个函数的第二个参数是tilemap坐标系的坐标,这就需要对世界坐标系中的坐标进行转换。我在网上查到了一个实现方式,尝试之后发现坐标位置有问题。
以下是代码部分,我目标是在中心位置替换原来的tile为石头,而用一个sprite小黑人来标示中心位置
tilemap是50x25tiles,每个tile是32x32像素,总的分辨率也就是1600x800
而设计分辨率设置为480x320,FIXEDHEIGHT,模拟器选择iphone6,所以实际的设计分辨率为570x320。
从图片资源到设计分辨率选择的是高比,即800/320。
程序convertPointToTiledPoint输入是点(285,160)也就是中心点在visible和win中心的位置,而输出的是(23,12)而非(25,12)
在看程序内Point point = (touchpoint - map->getPosition())*Director::getInstance()->getContentScaleFactor();
这条语句就是转换为tilemap坐标系中的像素坐标,得到的是(712.5, 400),而不是(800, 400)。说明这段程序实际上求得的是以visialOrigin为原点的坐标值,而不是tilemap坐标原点为基础的坐标值。也就是说map->getPosition()没有达到我期望中的效果,我以为它会给出一个tilemap原点在世界坐标系中的一个值,这个值在这里应该是(-87.5, 0)
auto map = TMXTiledMap::create("bg.tmx");
auto bgLayer = map->getLayer("bg");
bgLayer->setAnchorPoint(Vec2(0.5f, 0.5f));
bgLayer->setPosition(Vec2(origin.x + visibleSize.width/2, origin.y + visibleSize.height/2));
bgLayer->setTileGID(32, convertPointToTiledPoint(Vec2(visibleSize.width/2, visibleSize.height/2), map));
auto player = Sprite::create("Player.png");
player->setPosition(Vec2(visibleSize.width/2, visibleSize.height/2));
this->addChild(player);
```
Point TestScene::convertPointToTiledPoint(Point touchpoint, TMXTiledMap *map) {
Point point = (touchpoint - map->getPosition())*Director::getInstance()->getContentScaleFactor();
point.x = (int) (point.x / map->getTileSize().width);
point.y = (int) ((map->getMapSize().height * map->getTileSize().height - point.y) /
map->getTileSize().height);
return point;
}
```
