3.5.2版本TiledTile无法绑定点击事件

在map脚本下试图将地图图块绑定MOUSE事件,结果无响应,绑定整个地图就没问题。不是图块大小为零的原因。

start()
{
/this.node.on(Node.EventType.MOUSE_MOVE, (event: EventMouse) =>
{
console.log(event.getUILocation());
}, this.node);
/
let tmaplayer = this.getComponent(TiledMap).getLayer(‘floor’);
let tsize = tmaplayer.getLayerSize();
for (let i = 0; i < tsize.height; i++)
{
for (let j = 0; j < tsize.width; j++)
{
let tiled = tmaplayer.getTiledTileAt(i, j, true);
let n = tiled.node;
n.on(Node.EventType.MOUSE_MOVE, (event: EventMouse) =>
{
console.log(tiled.x, tiled.y);
console.log(event.getUILocation());
},n,false);
}
}
}

tiledtile

image
设置下 tilenode 的 layer

谢谢,成功绑定了tiledtile节点事件,并且事件成功触发。但是问题又来了,我使用的地图是15*15的地图,只有最后两排大约30个节点能够触发,其他节点不能触发,是事件系统池子容量有限吗?

start()
{
    let tmaplayer = this.getComponent(TiledMap).getLayer('floor');
    let tsize = tmaplayer.getLayerSize();
    for (let i = 0; i < tsize.height; i++)
    {
        for (let j = 0; j < tsize.width; j++)
        {
            let tiled = tmaplayer.getTiledTileAt(j, i, true);
            if (i == 14 || i ==13 || i==12) tiled.node.active = false;
            let n = tiled.node;
            n.layer = Layers.Enum.UI_2D;
            //n.setPosition(new Vec3(j * 32-100, i * 32-100, 0));
            n.getComponent(UITransform).width = 32;
            n.getComponent(UITransform).height = 32;
            n.getComponent(UITransform).anchorX = 0;
            n.getComponent(UITransform).anchorY = 1;
            n.on(Node.EventType.MOUSE_MOVE, (event: EventMouse) =>
            {
                console.log(tiled.x, tiled.y);
                //console.log(event.getUILocation());
            }, n);
        }
    }
}

如上,排除height为12、13、14的节点以后,其他节点不会触发,而节点触不触发事件好像也是随机的,不是稳定触发。

不再寻求节点触发tiledtile位置确定,因为发现六角形和其他形状的tiledtile本质上也是正方形的,所以还是要计算鼠标点击点是否在本地块内,靠代码切分。
现在脚本实现了正方形、六角形、45度斜视三种地块类型的tiledmap地块点击支持。


现在的问题是,如何使用一个tiledmap动态加载TiledMapAsset,使用resources.load报错,查了现版本应该是不支持。

不用回应,使用assetManager加载成功。

请问六角形地图判断点击tiledmap地块是怎么实现的呢

算呗,将地图分块,不同类的块用不同的算法算。无标题
一个六边形高度是32,从上到下分为4块,但是从重复的角度看实际上下边3块是一组,因为这个六边形的头其实是上边六边形的尾,所以腰部16像素,底部8像素,将点击的鼠标坐标除以8,除数能看出点击的位置在那一列,余数能看出点击位置是腰部还是底部。如果是底部的话除以一格32个像素的一半16,除数算行数,余数根据斜线判断点击位置在斜线上还是下。如图ABCDEF分别处理。