Processing打苍蝇游戏异常:点击时生成多只苍蝇且分数异常上涨
打苍蝇游戏问题修复方案
错误点分析
- 错误1:
draw()里手动调用mousePressed()
Processing的mousePressed()是内置事件函数,鼠标按下时会自动触发,根本不需要在draw()里调用。而draw()每秒跑60次,这就导致只要按住鼠标,就会反复执行碰撞检测,疯狂添加新苍蝇、涨分数。 - 错误2:
collisionDetect()遍历逻辑无限制
每次执行这个函数,会遍历所有苍蝇,只要鼠标碰到任何一只活苍蝇,就加新苍蝇。再加上draw()的反复调用,瞬间就能生成一堆苍蝇,分数也会乱涨。 - 错误3:
mousePressed()函数逻辑误用
这个函数本身就是鼠标按下时的触发事件,没必要再判断mousePressed变量,而且应该只在按下瞬间执行一次检测,不是持续执行。
修复步骤
- 删掉
draw()里的mousePressed()调用,让它只作为事件回调自动触发。 - 修改
collisionDetect():找到被拍中的活苍蝇后,标记为已拍死,添加一只新苍蝇,然后立刻终止循环,避免一次触发多只苍蝇的逻辑。 - 把苍蝇拍的显示移到
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
相关产品推荐
相关产品推荐

