Phaser中选中的所有Tile属性均为Null问题排查求助
问题原因与解决办法
你遇到的tile返回Null、无法读取index属性的问题,核心原因是调用getTileAt时传参错误:
getTileAt(tileX, tileY)方法要求传入的是瓦片在网格中的行列索引(比如第2行第4列的瓦片,tileX=4,tileY=2);- 你当前传入的
worldPoint.x和worldPoint.y是世界像素坐标,并非网格索引,导致方法找不到对应瓦片,返回Null。
两种修复方案
方案1:直接使用getTileAtWorldXY
这个方法专门用于通过世界像素坐标获取瓦片,无需手动转换坐标:
// 替换原代码中的getTileAt调用 var tile = groundLayer.getTileAtWorldXY(worldPoint.x, worldPoint.y); console.log(tile?.index); // 用可选链避免无瓦片时的报错
方案2:复用已计算的瓦片坐标
你代码里已经通过worldToTileXY算出了pointerTileXY(世界坐标转成的网格索引),直接用它的参数即可:
// 替换原代码中的getTileAt调用 var tile = groundLayer.getTileAt(pointerTileXY.x, pointerTileXY.y); console.log(tile?.index);
修正后的update函数片段
function update(time, delta) { controls.update(delta); const worldPoint = this.input.activePointer.positionToCamera(this.cameras.main); const pointerTileXY = groundLayer.worldToTileXY(worldPoint.x, worldPoint.y); const snappedWorldPoint = groundLayer.tileToWorldXY(pointerTileXY.x, pointerTileXY.y); marker.setPosition(snappedWorldPoint.x, snappedWorldPoint.y); if (this.input.manager.activePointer.isDown) { if (shiftKey.isDown) { groundLayer.removeTileAtWorldXY(worldPoint.x, worldPoint.y); } else { groundLayer.putTileAtWorldXY(353, worldPoint.x, worldPoint.y); // 使用方案1的写法 var tile = groundLayer.getTileAtWorldXY(worldPoint.x, worldPoint.y); console.log(tile ? tile.index : "当前位置无瓦片"); } } }
内容的提问来源于stack exchange,提问作者Vatsa Pandey
相关产品推荐
相关产品推荐

