如何提升对象方法使用效率?求小游戏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




