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

如何在p5.js猫巴士游戏中实现随机生成的左移碰撞体功能

p5.js猫巴士游戏碰撞功能实现方案

新增全局变量

在现有代码的全局变量部分添加以下内容:

let obstacles = []; // 存储所有生成的障碍物
let tinyTotoImg; // 障碍物素材变量
let lastObstacleTime = 0; // 记录上次生成障碍物的时间
const minSpawnInterval = 1200; // 生成障碍物的最小间隔(单位:毫秒)
const maxSpawnInterval = 3000; // 生成障碍物的最大间隔
const catWidth = 270; // 和你设置的猫巴士GIF尺寸一致
const catHeight = 100;
const obstacleWidth = 50; // 可根据tinyToto实际尺寸调整
const obstacleHeight = 80;

加载障碍物素材

在preload()函数中添加素材加载逻辑:

function preload() {
  // 原有代码不变
  tinyTotoImg = loadImage("tinyToto.png"); // 替换为你自己的素材路径
}

新增工具函数

新增两个工具函数,分别处理障碍物生成和碰撞检测:

// 生成新的障碍物
function spawnObstacle() {
  obstacles.push({
    x: width, // 从屏幕右侧边缘生成
    y: startY + catHeight - obstacleHeight, // 对齐地面,保证和猫巴士处于同一水平高度
    width: obstacleWidth,
    height: obstacleHeight
  })
}

// AABB轴对齐碰撞检测,判断两个矩形是否重叠
function checkCollision(cat, obstacle) {
  return cat.x < obstacle.x + obstacle.width &&
         cat.x + catWidth > obstacle.x &&
         cat.y < obstacle.y + obstacle.height &&
         cat.y + catHeight > obstacle.y;
}

修改draw函数添加核心逻辑

在draw()函数的最后添加以下代码,处理障碍物生成、移动、碰撞判定和游戏结束逻辑:

// 游戏运行中逻辑
if (mode == 1) {
  let currentTime = millis();
  // 随机时间间隔生成障碍物
  if (currentTime - lastObstacleTime > random(minSpawnInterval, maxSpawnInterval)) {
    spawnObstacle();
    lastObstacleTime = currentTime;
  }

  // 遍历处理所有障碍物
  for (let i = obstacles.length - 1; i >= 0; i--) {
    // 障碍物和背景同速左移
    obstacles[i].x -= scrollSpeed;
    // 渲染障碍物
    image(tinyTotoImg, obstacles[i].x, obstacles[i].y, obstacles[i].width, obstacles[i].height);

    // 移除超出屏幕的障碍物,优化性能
    if (obstacles[i].x < -obstacles[i].width) {
      obstacles.splice(i, 1);
      continue;
    }

    // 碰撞判定
    if (checkCollision(cat, obstacles[i])) {
      mode = 2; // 切换为游戏结束状态
      bing.stop(); // 停止背景音乐
    }
  }
}

// 游戏结束提示
if (mode == 2) {
  textSize(60);
  textFont(font1);
  fill("red");
  text("游戏结束", 380, 500);
  textSize(30);
  fill("white");
  text("按F5刷新重新开始", 370, 550);
}

小优化提示

如果觉得碰撞判定太严格,一碰边缘就死,可以修改碰撞检测函数里的猫巴士参数,给碰撞盒留一点余量,比如用cat.x + 20、catWidth - 40缩小猫的有效碰撞范围,游戏体验会更友好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:36:01