Bonfire游戏引擎中拾取物品后布尔变量无法重置为false的问题
问题根因
Dart语言中bool属于基础值类型,参数传递遵循值传递规则:你调用checkMagicHitForEachBox时传入的MagicHeart.heart只是将当前布尔值复制给了形参itemBooleanValue,函数内部修改itemBooleanValue仅会改变这个局部变量的取值,完全不会影响MagicHeart类的静态变量heart。因此拾取标识永远停留在true状态,每毫秒触发的updateGame都会重复执行写入槽位的逻辑,最终导致物品被复制到所有空槽位。
修复方案
1. 直接修改原静态变量替代修改形参
将函数内对itemBooleanValue的赋值改为直接操作MagicHeart.heart即可解决标识重置失效的问题,同时修正原代码中槽位满的判断逻辑错误(原逻辑仅在拾取标识为false时才判断槽位是否已满,不符合业务需求),修改后的检测函数代码如下:
checkMagicHitForEachBox(bool itemBooleanValue, String magicName) { if (itemBooleanValue == true) { if (bottomMaigcItemSlot == null) { setState(() { MagicHeart.heart = false; // 直接修改原静态变量而非局部形参 bottomMaigcItemSlot = magicName; }); } else if (topMagicItemSlot == null) { setState(() { MagicHeart.heart = false; // 直接修改原静态变量而非局部形参 topMagicItemSlot = magicName; }); } } // 修正槽位满判断逻辑,两个槽都有值时才标记为满 if (topMagicItemSlot != null && bottomMaigcItemSlot != null) { print('full'); setState(() { widget.magicFull = true; }); } }
2. 后续扩展优化建议
- 你当前代码中
bottomMaigcItemSlot存在拼写错误(Magic误写为Maigc),建议修正避免后续维护踩坑 - 不要用静态变量存储单件拾取状态,后续如果新增其他可拾取物品时,静态变量全局唯一的特性会导致状态冲突。可以改为传感器触发时直接向界面层发送拾取事件,替代
update轮询检测,性能更好也不会出现值传递类的问题。
内容的提问来源于stack exchange,提问作者Cameron Johnson
相关产品推荐
相关产品推荐

