Processing中实现碰撞触发后永久绘制圆圈的方法
解决碰撞后圆圈永久显示的问题
嘿,我明白你的问题了——你现在的代码里,碰撞发生时只会在那一帧画出顶部的圆圈,下一次画面刷新就没了对吧?这是因为Processing(看起来你用的是Processing)的draw()函数是逐帧循环执行的,默认每帧都会用background()清空画布,所以你只在碰撞触发的那一瞬间画了一次圆圈,之后的帧不会再画,自然就消失了。
要让圆圈永久保留,我们需要用一个状态变量来记录“碰撞是否已经发生过”,然后在每一次draw()循环里都检查这个变量,只要碰撞发生过,就重新绘制这些圆圈。具体步骤如下:
1. 添加全局状态变量
在代码最顶部(所有函数外面)定义一个布尔变量,用来标记碰撞是否已经发生:
boolean collisionOccurred = false;
2. 修改碰撞检测逻辑
把原来在if里绘制圆圈的代码移出去,只在碰撞发生时把状态变量设为true:
if (BallY == y && BallX == x) { // check for collision x = 80; // reset x to initial y = 240; // reset y to initial z = 100; //reset z to initial // 标记碰撞已发生 collisionOccurred = true; }
3. 在draw()中持续绘制圆圈
在draw()函数的合适位置(比如所有其他绘制逻辑之后),检查状态变量,如果为true就绘制圆圈:
// 检查碰撞状态,绘制顶部圆圈 if (collisionOccurred) { fill(250,0,0); for (int i=50; i<width; i+=80) { ellipse(i, 50, 70, 70); } }
完整示例代码
把这些整合起来,你的代码大概会是这样:
// 全局状态变量:标记是否发生过碰撞 boolean collisionOccurred = false; // 假设你的其他变量定义在这里 int BallX, BallY; int x = 80, y = 240, z = 100; int width = 400; // 根据你的实际画布宽度调整 void setup() { size(400, 400); // 初始化画布,根据你的需求调整 } void draw() { background(255); // 每帧清空画布(默认行为) // 这里放你原来的绘制逻辑,比如绘制小球、移动的物体等 // 碰撞检测 if (BallY == y && BallX == x) { x = 80; y = 240; z = 100; collisionOccurred = true; } // 持续绘制顶部圆圈(只要碰撞发生过) if (collisionOccurred) { fill(250,0,0); for (int i=50; i<width; i+=80) { ellipse(i, 50, 70, 70); } } }
这样修改后,只要碰撞发生过,每一次draw()循环都会重新绘制这些圆圈,它们就会一直显示在屏幕顶部啦。如果之后你需要重置这个状态(比如让圆圈消失),只要把collisionOccurred设回false就行。
内容的提问来源于stack exchange,提问作者Aaryan
相关产品推荐
相关产品推荐

