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

P5.js躲避球游戏通关后仅单个红点加速 无法全量提速问题

问题根因

你把通关触发、玩家重置、圆点加速的逻辑写在了dots.forEach()的遍历回调内部:

  • forEach会逐个遍历6个红色圆点,每处理1个圆点就会跑一次你写的通关判断
  • 玩家第一次抵达出口时,遍历到第1个圆点就会命中判断:立刻把玩家坐标重置回起点(25,25),仅给当前正在遍历的这1个圆点速度乘1.5,关卡数+1
  • 后续遍历剩下5个圆点时,玩家已经被移回起点,通关判定条件不成立,剩余圆点不会被加速,最终表现为只有1个圆点速度提升
  • 额外逻辑冲突:你在forEach外部又写了一次通关判定,只要玩家在出口位置就直接切胜利状态,根本不会触发多轮加速的下一关逻辑。
修复步骤
  1. 把通关判定、玩家重置、圆点加速的逻辑整体从dots.forEach()回调里移出来,不要放在单个圆点的处理流程中
  2. 触发加速时,遍历所有圆点统一修改速度值,不要只修改当前遍历的单个dot
  3. 调整胜利状态的触发条件,不要刚到出口就直接切胜利页,否则无法实现逐关加速的效果
  4. 速度值的正负号本身代表运动方向,直接乘倍率不会改变圆点原运动方向,不需要额外调整方向
核心修改代码

首先删除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:06:23