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

Processing打苍蝇游戏异常:点击时生成多只苍蝇且分数异常上涨

打苍蝇游戏问题修复方案

错误点分析

  • 错误1:draw()里手动调用mousePressed()
    Processing的mousePressed()是内置事件函数,鼠标按下时会自动触发,根本不需要在draw()里调用。而draw()每秒跑60次,这就导致只要按住鼠标,就会反复执行碰撞检测,疯狂添加新苍蝇、涨分数。
  • 错误2:collisionDetect()遍历逻辑无限制
    每次执行这个函数,会遍历所有苍蝇,只要鼠标碰到任何一只活苍蝇,就加新苍蝇。再加上draw()的反复调用,瞬间就能生成一堆苍蝇,分数也会乱涨。
  • 错误3:mousePressed()函数逻辑误用
    这个函数本身就是鼠标按下时的触发事件,没必要再判断mousePressed变量,而且应该只在按下瞬间执行一次检测,不是持续执行。

修复步骤

  1. 删掉draw()里的mousePressed()调用,让它只作为事件回调自动触发。
  2. 修改collisionDetect():找到被拍中的活苍蝇后,标记为已拍死,添加一只新苍蝇,然后立刻终止循环,避免一次触发多只苍蝇的逻辑。
  3. 把苍蝇拍的显示移到draw()里,这样才能实时跟随鼠标,mousePressed()只负责触发碰撞检测。

修正后的代码

PImage fly, flybye, swatter, swatted;
float[] fX, fY;
int[] swat;
int score = 0;

void setup() {
  size(800, 400);
  // 加载并调整图片尺寸
  fly = loadImage("fly.png");
  fly.resize(50, 0);
  flybye = loadImage("flybye.png");
  flybye.resize(50, 0);
  swatter = loadImage("swatter.png");
  swatted = loadImage("swatted.png");
  
  // 初始化数组,生成第一只苍蝇
  fX = new float[0];
  fY = new float[0];
  swat = new int[0];
  
  addNewFly();
}

void draw() {
  background(255);
  populate();
  // 显示分数
  fill(0);
  textSize(30);
  text("Score: " + score, 20, 50);
  noCursor();
  // 实时切换苍蝇拍状态
  if (mousePressed) {
    image(swatted, mouseX - 35, mouseY - 25);
  } else {
    image(swatter, mouseX - 35, mouseY - 25);
  }
}

void populate() {
  for (int i = 0; i < fX.length; i++) {
    if (swat[i] == 1) {
      image(flybye, fX[i], fY[i]);
    } else {
      image(fly, fX[i], fY[i]);
    }
  }
}

void collisionDetect() {
  // 只遍历活苍蝇
  for (int i = 0; i < swat.length; i++) {
    if (swat[i] == 0) {
      if (mouseX > fX[i] && mouseX < fX[i] + fly.width &&
          mouseY > fY[i] && mouseY < fY[i] + fly.height) {
        swat[i] = 1; // 标记为已拍死
        addNewFly(); // 生成新苍蝇
        score++;
        break; // 只处理一次碰撞,避免一次拍中多只
      }
    }
  }
}

// 封装添加新苍蝇的逻辑,减少重复代码
void addNewFly() {
  // 限制坐标,避免苍蝇超出屏幕
  fX = append(fX, random(width - fly.width));
  fY = append(fY, random(height - fly.height));
  swat = append(swat, 0);
}

void mousePressed() {
  collisionDetect(); // 鼠标按下时仅执行一次碰撞检测
}

额外优化说明

  • 添加新苍蝇时限制坐标范围,避免苍蝇跑到屏幕外面显示不全。
  • 把添加新苍蝇的逻辑封装成函数,代码更整洁,也方便后续修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:21:25