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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:54:57