You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何提升对象方法使用效率?求小游戏TypeB物品实现代码

问题2:TypeB物品的实现方案

针对你说的「持续检测条件,满足后仅执行一次」的B类物品,我给你写了一套可扩展的实现代码,完全适配你的商店+背包场景:

首先,先统一管理物品配置,把TypeA和TypeB的规则分开:

// 全局物品配置:新增物品只需在这里加配置
const gameItems = {
  item1TypeA: {
    type: 'A',
    price: 100, // 示例价格
    action: () => {
      // TypeA物品的点击触发逻辑,比如直接使用
      alert('你使用了TypeA物品!');
    }
  },
  item2TypeB: {
    type: 'B',
    price: 200,
    // 自定义检测条件:替换成你需要的触发规则(比如背包有某物品、玩家等级达标)
    checkCondition: () => {
      return player.level >= 3 && backpack.includes('item1TypeA');
    },
    // 满足条件后执行的逻辑,只会跑一次
    triggerAction: () => {
      alert('TypeB物品触发!获得500金币奖励!');
      player.gold += 500;
    },
    hasTriggered: false // 标记是否已触发,避免重复执行
  }
};

// 模拟玩家和背包数据(替换成你的实际数据即可)
const player = { level: 1, gold: 1000 };
const backpack = [];

然后是购买函数,处理金币扣除和背包存入逻辑:

function buy(itemKey) {
  const item = gameItems[itemKey];
  if (!item) return;

  // 检查金币是否足够
  if (player.gold < item.price) {
    alert('金币不够哦!');
    return;
  }

  // 完成购买流程
  player.gold -= item.price;
  backpack.push(itemKey);
  alert(`成功购买${itemKey},已存入背包!`);

  // TypeB物品购买后立即检查一次条件,不用等下一帧
  if (item.type === 'B' && !item.hasTriggered) {
    checkTypeBItem(item);
  }
}

核心的TypeB物品检测逻辑,用requestAnimationFrame和游戏帧率同步,比setInterval更流畅:

function docReady() {
  // 页面加载完成后启动检测循环
  startTypeBDetection();
}

function startTypeBDetection() {
  // 遍历所有未触发的TypeB物品,检查条件
  Object.values(gameItems).forEach(item => {
    if (item.type === 'B' && !item.hasTriggered) {
      checkTypeBItem(item);
    }
  });

  // 只要还有未触发的TypeB物品,就继续循环检测
  const hasUnTriggeredBItems = Object.values(gameItems).some(item => 
    item.type === 'B' && !item.hasTriggered
  );
  if (hasUnTriggeredBItems) {
    requestAnimationFrame(startTypeBDetection);
  }
}

// 复用的检查函数
function checkTypeBItem(item) {
  if (item.checkCondition()) {
    item.triggerAction();
    item.hasTriggered = true; // 标记为已触发,后续不再检测
  }
}

最后补全你的HTML代码(适配你之前的片段):

<body onload="docReady()">
  <!-- TypeA物品:点击触发购买 -->
  <img src="img1.png" onclick="buy('item1TypeA')" alt="TypeA物品" />
  <!-- TypeB物品:点击触发购买 -->
  <img src="img2.png" onclick="buy('item2TypeB')" alt="TypeB物品" />
</body>

这个方案的优势:

  • 配置化管理物品,新增B类物品只需加配置,不用改核心逻辑
  • requestAnimationFrame和游戏帧率同步,不会出现卡顿
  • 每个B类物品有独立的触发标记,确保动作只执行一次
  • 购买后立即检查条件,提升用户体验

内容的提问来源于stack exchange,提问作者idontknowanygoodusernames

火山引擎 最新活动