游戏开发:如何让满足条件的金币增加逻辑仅执行一次?
嘿,这个问题我之前做小游戏的时候也遇到过!核心问题就是你没有记录「这个金币区域已经被收集过」的状态,导致每次检测到角色在里面都会重复触发金币增加逻辑。这里有几个实用的解决方案,你可以根据游戏的具体需求来选择:
解决方案:添加状态记录避免重复触发
方法1:标记已收集的金币格子(适合可重复刷新的金币)
如果你的金币是一段时间后会重新刷新的,那可以维护一个和地图同尺寸的二维数组,用来记录每个格子的金币是否已经被收集:
// 初始化一个和mapArray同大小的数组,默认所有格子都未收集金币 const collectedGold = Array(mapArray.length).fill().map(() => Array(mapArray[0].length).fill(false)); function foundGold(ptX, ptY) { var gridX = Math.floor(ptX / 36); var gridY = Math.floor(ptY / 36); // 只有当当前格子是金币区,且未被收集过的时候才返回true if(mapArray[gridY][gridX] === 3 && !collectedGold[gridY][gridX]) { // 标记该格子的金币已被收集 collectedGold[gridY][gridX] = true; return true; } return false; }
之后你的原有判断逻辑不需要改动,因为foundGold现在只会在角色第一次进入金币区时返回true。如果需要实现金币刷新,只需要在合适的时机重置对应格子的collectedGold状态为false即可。
方法2:直接修改地图数据(适合一次性永久消失的金币)
如果金币被踩过之后就永久消失,不需要刷新,那最简单的方式就是在收集金币后直接修改地图数组里的标记,把代表金币的3改成其他值(比如0代表空区域):
function foundGold(ptX, ptY) { var gridX = Math.floor(ptX / 36); var gridY = Math.floor(ptY / 36); if(mapArray[gridY][gridX] === 3) { // 将当前格子的金币标记移除,避免重复检测 mapArray[gridY][gridX] = 0; return true; } return false; }
这样下次检测同一个格子时,地图里已经没有金币标记了,自然不会重复触发金币增加逻辑。
方法3:用状态变量记录上一帧位置(适合持续帧检测的场景)
如果你的游戏是每一帧都在循环检测角色位置,那可以维护一个状态变量,记录上一帧角色是否处于金币区。只有当角色从「不在金币区」切换到「在金币区」的瞬间,才触发金币增加:
// 定义一个状态变量,记录上一帧是否在金币区 let wasInGoldZone = false; // 在你的检测逻辑中: const currentInGoldZone = foundGold(boatPosX + 36, boatPosY); // 只有当当前在金币区,且上一帧不在的时候才加金币 if(currentInGoldZone && !wasInGoldZone) { goldAmount += 1; gold.innerHTML = goldAmount; } // 更新状态变量,为下一帧检测做准备 wasInGoldZone = currentInGoldZone;
这种方法不需要修改原有的foundGold函数,只需要在调用的地方增加状态判断,适合不想改动地图数据或额外维护收集记录的场景。
内容的提问来源于stack exchange,提问作者Limpuls
相关产品推荐
相关产品推荐

