PhaserJS中数组因鼠标按下触发多次更新的解决问询
解决Phaser中鼠标点击重复触发库存操作的问题
方法一:用Phaser原生点击事件(最推荐)
别在update循环里检测鼠标状态,Phaser自带的pointerdown事件天生是单次触发的,完全适配点击需求:
// 在场景的create方法中绑定全局点击事件 this.input.on('pointerdown', () => { const tileIndex = this.inventory.indexOf(tileType); if (tileIndex !== -1) { this.inventory[tileIndex + 1] -= 1; console.log(this.inventory); } });
如果是给特定UI元素(比如按钮)绑定点击,只需先开启交互再绑定事件:
// 假设你有一个名为useItemBtn的按钮对象 useItemBtn.setInteractive(); useItemBtn.on('pointerdown', () => { const tileIndex = this.inventory.indexOf(tileType); if (tileIndex !== -1) { this.inventory[tileIndex + 1] -= 1; console.log(this.inventory); } });
方法二:添加状态标记(适配必须在update中处理的场景)
如果一定要在update里做判断,就加个状态变量记录是否已经处理过当前点击,避免重复执行:
// 在场景类的构造或create方法里初始化状态 this.hasProcessedClick = false; // 在update方法中 update() { const pointerIsDown = this.input.manager.activePointer.isDown; if (pointerIsDown && !this.hasProcessedClick) { this.hasProcessedClick = true; // 执行库存操作 const tileIndex = this.inventory.indexOf(tileType); if (tileIndex !== -1) { this.inventory[tileIndex + 1] -= 1; console.log(this.inventory); } } else if (!pointerIsDown && this.hasProcessedClick) { // 鼠标抬起后重置状态,允许下次点击触发 this.hasProcessedClick = false; } }
额外优化:减少数组遍历次数
你的原代码多次调用indexOf,建议先把索引存起来,提升性能:
// 替换原逻辑中的多次indexOf调用 const tileIndex = this.inventory.indexOf(tileType); if (tileIndex !== -1) { this.inventory[tileIndex + 1] -= 1; console.log(this.inventory); }
内容的提问来源于stack exchange,提问作者Vatsa Pandey
相关产品推荐
相关产品推荐

