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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:36:04