求教大神一个算法

坐标定位,我的地图是一个 6666的块拼接而成,起点从3333开始,往后一个块就+66这样,就是X坐标就是 33+66+66+66+66,一直加到最右边,Y坐标就是 33+66+66+66,一直加到最上边,现在问题来了,当我在地图空白地方点击一下,我想知道,点击坐标位于哪个块内,这算法已经折磨了我近半年,希望有个大神帮助

什么,折磨了半年?不是除以66取整就行了么

let localPosition = this.地图节点.convertToNodeSpaceAR(e.getLocation());
let localGird = cc.v2(this.localPosition/this.瓦片宽度,localPosition.y/this.瓦片高度);
好像是这样。。可能有一点点出入 因为不知道你的anchor 自己再看情况加减半个瓦片宽高就行了
(恩 楼上正解)

取整+1 视乎可以解决

我发的问题大家一定帮忙,因为我飞商业目的纯娱乐而编程,你们不用担心帮助我或者说帮助我的公司而拿不到工资而感到内心纠结,我可以明确声明,我没从事编程行业的工作,我编程纯娱乐,我写的游戏将来运营完全娱乐于大众,我甚至不会考虑商城这些低俗的啃钱手段,那么我做的是什么游戏呢,大家肯定有点好奇,或者想看看画面,大家可能觉得我有点自恋啥东西还这么肯定,如果有足够的人关注我会适当的放出一些东西给公布出来

很简单东西
这个项目里的tileCoordForPosition就是获得tile的位置的

Point HelloWorld::tileCoordForPosition(Point position)
{
//很简单,就是取整,得出第n个tile,你的项目里不是从左下角开始算,因此你还要减去tilemap的偏移量,
//这个例子里面没有减去
 int x = position.x / _tileMap->getTileSize().width;
 int y = ((_tileMap->getMapSize().height * _tileMap->getTileSize().height) - position.y) / _tileMap->getTileSize().height;
 return Point(x, y);
}

这确实很简单,我觉你可能遇到的不仅仅是这个问题,很有可能你自己已经实现过这个功能,但是产生了一些错误,触摸和tile的位置不对应,真实使用的时候要注意一些缩放参数的问题,在这个例子中先不要进行以下两点操作:
1、不要对tiledmap进行缩放,tiledmap->setScale(2)这样的;
2、也不要在AppDelegate.cpp调用cocos2dx的设备缩放参数。用客户端创建项目的时候,是有这个设置的,比如你改成800*480。

如果你有上述操作,参考下这个,下面是我项目里使用到的(就是进行了一下坐标转换):

Point GameLayer::tileCoordForPosition(const Point& position)
{
    auto theMap = (Background*)this->getChildByTag(11);//我设计了layer用来放tiledmap
    auto factor = CC_CONTENT_SCALE_FACTOR();//系统设备的缩放因子,在AppDelegate.cpp里能找到相关
    auto realMap = theMap->getMap();//获得真正tiledmap,我给包装了一下
    //这里是重点了,position*factor是获得设计分辨率坐标,因为我的程序里对tiledmap进行了放大处理,这里要设置下,除以放大系数,获得坐标在tiledmap上的位置。
    auto pos = position*factor/theMap->getScale();
    int x = pos.x / realMap->getTileSize().width;
    int y = (realMap->getMapSize().height*realMap->getTileSize().height - pos.y) / realMap->getTileSize().height;
    return Point(x, y);
}

最后,还是缩放变换后坐标转换的问题。其实这个很简单,我觉得有必要详细写一下,因为我以前也遇到过这样的问题。买一送一,因为你后续肯定会碰到类似的问题。

1赞

你在哪上班