在Processing中如何删除或隐藏已绘制的2D图元?
问题原因
- 你的猜测是错误的,问题出在
draw()函数默认会以每秒约60次的频率持续循环执行。你在mouseReleased中绘制矩形遮盖窗口后,下一轮draw()执行会立刻重新调用maFenetre()把窗口再画出来,所以看起来隐藏逻辑没生效。 mouseReleased中的判断逻辑完全错误:你将布尔变量mousePressed和点击区域的布尔判断结果做等值比较,逻辑完全不符合需求。- 代码中缺少
largeurR变量的定义,运行会直接报错。
修正方案
- 新增一个布尔变量控制窗口的显示状态,默认设为显示
- 修正鼠标释放的逻辑:点击关闭按钮区域时将显示状态设为隐藏
- 在
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
相关产品推荐
相关产品推荐

