【已解决】cocos2dx读取tiled地图的object层

大家好,我使用cocos2dx读取tiled地图,得到object的后,取得的obj的坐标和tmx中不一致,代码如下:

auto map = TMXTiledMap::create(“RichMap/maps_34.tmx”);
map->setPosition(Point(winSize.width / 2 - map->getContentSize().width / 2,winSize.height / 2 - map->getContentSize().height / 2));
addChild(map,0,1);
auto* group = map->getObjectGroup(“buildproperty”);
auto& objs = group->getObjects();
for (auto& obj : objs)
{
ValueMap& dict = obj.asValueMap();
float cx = dict"x"].asFloat();
float cy = dict"y"].asFloat();
int index = dict"index"].asInt();
Sprite* builder = Sprite::create(“RichMap/BUICity0.png”);
builder->setPosition(cx,cy);
map->addChild(builder,2);
}

插入的图片错位很大。另外,如何动态的在指定位置添加精灵?

一样遇到了,同问……

顶起来。难道大家都不用瓦片地图?

我也遇到了。。。目前其余属性是对的,但是y坐标错误。

俩个坐标系要转换下把

tmx文件中的数值和程序读出来的数值不一样,难道程序内部作了坐标变换?不过感觉也不像。几个对象的y值变化如下:
99变成了803
1变成了959
0变成了323

顶起来啊。。。

我查到一个帖子,就是把TMX里面的x,y加到对象属性了,然后计算出对应的瓦片的左边,然后再添加对应的精灵,不过这样太增加工作量了。你们还只是Y坐标变化了,我是X和Y都变了,我的是45度的地图。

我也遇到了这个问题,我是在属性中增加了xpos和ypos,实在是没有办法的办法。。

这边是正常45度地图,发现cocos读出来的Y坐标值 和 tmx文件里的Y坐标值(竖直由下往上数……) 加起来正好等于 tmx里地图的高 减去一个 tile的高(……)……
X坐标也偏移了,但是看调试信息 读取的数据和tmx里一样,多半是没变换坐标系……

呵呵,我刚才看错了,我的X坐标也没有出现错误,另外,我跟踪了一下源码,知道了其中的逻辑,大家可以看看CCTMXXMLParser.cpp文件中的这个方法TMXMapInfo::startElement,具体可以查看if判断中的object的分支,代码如下:
int x = attributeDict"x"].asInt();
// Y
int y = attributeDict"y"].asInt();

Point p(x + objectGroup->getPositionOffset().x, _mapSize.height * _tileSize.height - y - objectGroup->getPositionOffset().x - attributeDict"height"].asInt());
p = CC_POINT_PIXELS_TO_POINTS§;
dict"x"] = Value(p.x);
dict"y"] = Value(p.y);

标红的代码非常重要,他将Y周的坐标做了换算,也就是地图的总高度-TMX中取到的Y的值-偏移量,再减去对应OBJ的高度,知道了原理后,就可以根据对应的逻辑换算回真是的Y支了。呵呵,希望对大家有帮助。非常感谢大家的回复。

他为什么做这个运算呢

每个对象都由一个最小的矩形包围。
貌似以前的坐标是原点在左上角的坐标系中,最小矩形左上顶点的坐标。
代码中拿到的坐标时原点在左下角的坐标系中,最小矩形左下顶点的坐标。

lz,能加你下QQ么,发站内信了。