You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 08:05:21