Phaser3背包系统BUG:物品填满全部18个槽位求助
问题分析与解决方案
你的代码逻辑本身找第一个空位放置物品是没问题的,break确实会跳出外层的while循环,问题出在这段代码被重复执行了——比如你把它放在了Phaser的update()方法里(每帧触发),或者某个会多次触发的事件回调中。只要this.has("key")和tutorial != "complete"的条件一直满足,每次执行都会找下一个空位塞key,直到把18个槽位填满。
解决步骤
1. 确保代码只执行一次
把这段物品放置逻辑,放到玩家获取物品的触发事件里(比如碰撞检测到key时的回调、点击拾取按钮的事件),而不是每帧循环执行。比如在Phaser中,当玩家与key sprite碰撞时:
// 示例:碰撞事件中执行放置逻辑 this.physics.add.overlap(player, keySprite, () => { if (tutorial != "complete") { let emptySlotIndex = this.pack.findIndex(slot => slot === null); if (emptySlotIndex !== -1) { this.pack[emptySlotIndex] = "key"; keySprite.destroy(); // 移除场景中的key } } });
2. 保留循环执行逻辑时,添加已存在判断
如果必须在循环执行的逻辑中保留这段代码(比如全局状态同步),需要额外判断背包中是否已经存在该物品,避免重复添加:
if (this.has("key") && tutorial != "complete" && !this.pack.includes("key")) { let count = 0; while (count < 18) { if (this.pack[count] == null) { this.pack[count] = "key"; break; } else { count += 1; } } }
或者用更简洁的findIndex替代手动循环:
if (this.has("key") && tutorial != "complete" && !this.pack.includes("key")) { const emptySlot = this.pack.findIndex(slot => slot === null); if (emptySlot !== -1) { this.pack[emptySlot] = "key"; } }
3. 检查has方法的逻辑
另外需要确认你的自定义has("key")方法是否正确——如果它在物品放入背包后仍然返回true,会持续触发添加逻辑。确保物品放入背包后,has("key")应该返回false(比如移除全局数组中的key)。
内容的提问来源于stack exchange,提问作者EmptyStone
相关产品推荐
相关产品推荐

