P5.js躲避球游戏通关后仅单个红点加速 无法全量提速问题
问题根因
你把通关触发、玩家重置、圆点加速的逻辑写在了dots.forEach()的遍历回调内部:
- forEach会逐个遍历6个红色圆点,每处理1个圆点就会跑一次你写的通关判断
- 玩家第一次抵达出口时,遍历到第1个圆点就会命中判断:立刻把玩家坐标重置回起点(25,25),仅给当前正在遍历的这1个圆点速度乘1.5,关卡数+1
- 后续遍历剩下5个圆点时,玩家已经被移回起点,通关判定条件不成立,剩余圆点不会被加速,最终表现为只有1个圆点速度提升
- 额外逻辑冲突:你在forEach外部又写了一次通关判定,只要玩家在出口位置就直接切胜利状态,根本不会触发多轮加速的下一关逻辑。
修复步骤
- 把通关判定、玩家重置、圆点加速的逻辑整体从
dots.forEach()回调里移出来,不要放在单个圆点的处理流程中 - 触发加速时,遍历所有圆点统一修改速度值,不要只修改当前遍历的单个dot
- 调整胜利状态的触发条件,不要刚到出口就直接切胜利页,否则无法实现逐关加速的效果
- 速度值的正负号本身代表运动方向,直接乘倍率不会改变圆点原运动方向,不需要额外调整方向
核心修改代码
首先删除dots.forEach()内部的这段错误逻辑:
// 删除以下片段 if (x > width-50 && y >height -50){ x =25; y =25; dot.s *= 1.5; level++; }
替换forEach外部的通关判定逻辑为以下内容:
// 所有圆点的移动、碰撞逻辑跑完后,再统一做通关判断 dots.forEach((dot) => { fill('red') ellipse(dot.x, dot.y, dot.d, dot.d); if (dot.direction === 'h') { dot.x += dot.s if (dot.x > width || dot.x < 0) { dot.s *= -1; } } else if (dot.direction === 'v') { dot.y += dot.s if (dot.y > height || dot.y < 0) { dot.s *= -1; } } // 碰撞判定保留 if (x < (dot.x + d) && (dot.x - d) < x) { if (y < (dot.y + d) && (dot.y - d) < y) { gamestate = 'lose'; } } }); // 统一通关处理 if (x > width - d && y > height - d) { // 重置玩家到起点 x = 25; y = 25; // 所有圆点同步加速 dots.forEach(dot => { dot.s *= 1.5; }); level += 1; // 示例:达到10关后触发胜利,可自行修改阈值 if (level >= 10) { gamestate = 'victory'; } }
内容的提问来源于stack exchange,提问作者rose
相关产品推荐
相关产品推荐

