求大神帮看问题,困扰了好几天的问题快崩溃了。。

point = convertToNodeSpace(point);
point.x = static_cast(point.x / map->getTileSize().width);
point.y = static_cast((map->getTileSize().height * map->getMapSize().height - point.y) / map->getTileSize().height);
auto *layer = map->getLayer(“bg1”);
auto gid = layer->tileGIDAt(point);
log(“gid:%d”, gid);
if (gid == 0)
return true;
auto p = map->getPropertiesForGID(gid).asValueMap();
if (!p"walk"].isNull() && !p"walk"].asBool()){ //判断点击位置是否在可移动范围内
return false;
}

就是这段 代码 这段代码是tilemap的碰撞检测 但是 auto gid = layer->tileGIDAt(point); 这里的GID 无论我把主角移动到哪 总是0不知怎么回事。。 tmx的tilesize= 8*8 不知和这个有光吗?

怎么没人啊?

point.x = static_cast(point.x / map->getTileSize().width);
point.y = static_cast((map->getTileSize().height * map->getMapSize().height - point.y) / map->getTileSize().height);

第一行代码: 这里使用了整除(因为Size的属性都是float, 这个应该没有影响), 然后又转换成了整形, 而poinX可能永远比width小(如 1 / 3.0, 2 / 3.0等), 结果当然永远都是0了.

第二行代码效果类似.

请问如何正确的根据玩家位置获得GID? 我那两行代码要如何修改?

http://www.cocoachina.com/bbs/read.php?tid=219259

看看吧.

按照你给的帖子上的公式 还是不行。。。
point = convertToNodeSpace(point);
point.x = point.x / map->getContentSize().width*map->getMapSize().width;
point.y = map->getMapSize().height - point.y / map->getContentSize().height *map->getMapSize().height;
auto *layer = map->getLayer(“bg1”);
auto gid = layer->getTileGIDAt(point);

什么叫不行, 还是显示的是0么? 把问题描述清楚点呀, 最好来几个运行时变量的内容的截图,

比如转换point之前和之后的值, map的mapSize, TitleSize, contentSize, layer 的layerSize等等

如果一直移动的话 获得的GID是0 如果单击移动 也就是移动一点点获得的GID位数 居然上万 。。。

公式前的point


公式后的point

截图 已上传 求帮忙看看

很显然, 越界了, 有可能你的layer就没获取正确, 你确认下. 我要看看layer和map的信息, 展开截个图.

谢谢 已经有人帮我解决了。 是因为没转换成int的原因 还有不能加convertToNodeSpace(point); 不知道为何

解决了就好.:14: