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

在Processing中如何删除或隐藏已绘制的2D图元?

问题原因

  • 你的猜测是错误的,问题出在draw()函数默认会以每秒约60次的频率持续循环执行。你在mouseReleased中绘制矩形遮盖窗口后,下一轮draw()执行会立刻重新调用maFenetre()把窗口再画出来,所以看起来隐藏逻辑没生效。
  • mouseReleased中的判断逻辑完全错误:你将布尔变量mousePressed和点击区域的布尔判断结果做等值比较,逻辑完全不符合需求。
  • 代码中缺少largeurR变量的定义,运行会直接报错。

修正方案

  1. 新增一个布尔变量控制窗口的显示状态,默认设为显示
  2. 修正鼠标释放的逻辑:点击关闭按钮区域时将显示状态设为隐藏
  3. 在draw()中先清屏,再根据显示状态判断是否要绘制窗口

修正后完整代码

float hauteurR = 700;
float barreFenetre = 50;
float xIcone = 80;
// 补全缺失的窗口宽度变量
float largeurR = 500;

float x = random(0,500);
float y = random(0,800);

color rouge = #FF0000;
color blanc = #FFFFFF;
// 新增窗口显示控制变量
boolean showFenetre = true;

void setup() {
  size(1500,1500); 
  background(#C1C1C1);
}

void rectangle(){
  rect((x+largeurR)-xIcone,y,xIcone,barreFenetre);
}

void maFenetre(){
  //fenetre
  noStroke();
  fill(#89E0FF);
  rectMode(CORNER);
  rect(x,y,largeurR,hauteurR);
  
  //barre croix
  rectMode(CORNER);
  fill(blanc);
  noStroke();
  rect(x,y,largeurR,barreFenetre);
  
  if ((mouseX>= (x+largeurR)-xIcone && mouseX <= x+largeurR) && (mouseY >= y && mouseY <= y+barreFenetre)) {
    fill(rouge);
    rectangle();
  }

  //barre aggrandir
  if ((mouseX>= (x+largeurR)-xIcone*2 && mouseX <= (x+largeurR)-xIcone) && (mouseY >= y && mouseY <= y+barreFenetre)) {
    fill(#CEDDDE);
    noStroke();
    rect((x+largeurR)-xIcone*2,y,xIcone,barreFenetre);
  }
 
  //barre reduire
  if ((mouseX>= (x+largeurR)-xIcone*3 && mouseX <= (x+largeurR)-xIcone*2) && (mouseY >= y && mouseY <= y+barreFenetre)) {
    fill(#CEDDDE);
    noStroke();
    rect((x+largeurR)-xIcone*3,y,xIcone,barreFenetre);
  }
   
  //icone réduire
  stroke(#000000);
  strokeWeight(2);
  line((x+largeurR)-xIcone*2.65,y+barreFenetre/2,(x+largeurR)-xIcone*2.35,y+barreFenetre/2);
   
  //icone aggrandir
  stroke(#000000);
  strokeWeight(2);
  noFill();
  rectMode(CENTER);
  rect((x+largeurR)-xIcone*1.5,y+barreFenetre/2,20,20);
 
  //icone croix
  stroke(#030303);
  strokeWeight(2.5);
  line((x+largeurR)-xIcone*0.62,y+barreFenetre*0.35,(x+largeurR)-xIcone*0.38,y+barreFenetre*0.75);
  line((x+largeurR)-xIcone*0.62,y+barreFenetre*0.75,(x+largeurR)-xIcone*0.38,y+barreFenetre*0.35);
}
  
void draw() {
  // 每次绘制先清屏,避免绘制残留
  background(#C1C1C1);
  // 只有显示状态为true时才绘制窗口
  if(showFenetre){
    maFenetre();
  }
}

void mouseReleased(){
  // 判断是否点击了关闭按钮区域
  boolean clickCloseBtn = (mouseX>= (x+largeurR)-xIcone && mouseX <= x+largeurR) && (mouseY >= y && mouseY <= y+barreFenetre);
  if(clickCloseBtn){
    // 点击关闭按钮则隐藏窗口
    showFenetre = false;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:27:03