鼠标按下事件调用两次

Mouse press event called twice

以下代码无法正常工作,我想要发生的是用鼠标按下调用 placing_shapes_in_screen 函数,然后等待再次按下以在屏幕上放置一个对象,但实际上是什么发生的是第一个按键被注册了两次!!请帮忙?

boolean cont = false;

void setup(){
    size(500,400);
    background(0,0,53);
}  

void draw(){
    if(mousePressed){
    placing_shapes_in_screen();
    println("done");
    }
}


void placing_shapes_in_screen(){

    fill(204,0,102);
    text("Hello", 60, 90);
    noFill();  

    while(cont == false){    
    if(mousePressed){
    ellipse(mouseX,mouseY,20,20);
    cont=true;
    }
    }
    cont=false;

}

问题可能是默认情况下绘制每秒调用 60 次。这使得依赖 var mousePressed 来控制用户交互,不是很精确,也许按钮仍然被按下,1/60 秒后...

方法是使用函数 mousePressed() or mouseClicked(),当其中一个事件发生时调用一次回调函数。

像这样的东西:

void mousePressed(){
place_shapes_in_screen();
}


void place_shapes_in_screen(){
fill(204,0,102);
text("Hello", 60, 90);
noFill();   
ellipse(mouseX,mouseY,20,20);

}

编辑以回答 OP 的评论:

然后您需要检查鼠标是否在按钮内,以及一个标志(或程序状态)来处理放置椭圆。

伪代码的种类:

boolean okToPlace = false;



void mousePressed(){
    if(mouseIsInsideButton()){
        okToPlace = true;
        }else if (okToPlace){
        place_shapes_in_screen()
    }

}

void place_shapes_in_screen(){
    fill(204,0,102); 
    text("Hello", 60, 90);
    noFill();   
    ellipse(mouseX,mouseY,20,20);
    okToPlace = false; // <<<<<<<<<!!
}

edit2

这里是 sketchpad.cchere 在线工作的:

boolean okToPlace = false;
PVector button;


void setup(){
    size(300,300);
    //using z for size
    button = new PVector(20, height-40, 20);

    }


void draw(){

    color f = isInsideButton()? color(255,0,0):color(0,0,255);
   fill(f);
    rect(button.x, button.y, button.z, button.z);    
    }




void mousePressed(){
    if(isInsideButton()){
        okToPlace = true;
        }else if(okToPlace){
            ellipse(mouseX, mouseY, 80,80);
            okToPlace = false;
            }
    }


boolean isInsideButton(){
    return mouseX > button.x &&
           mouseX < button.x+button.z &&
           mouseY > button.y &&
           mouseY < button.y + button.z;
    }

I want the second mouse press to be separate to the first.

考虑使用 mousePressed() 函数代替 mousePressed 变量。像这样:

void setup(){
 background(0); 
}

void draw() {}

void mousePressed() {
   println("Mouse pressed.");
   ellipse(mouseX, mouseY, 10, 10);
}

只要按住鼠标,mousePressed 变量就为真,因此您不会为不同的点击获得单独的 事件 mousePressed() 函数仅在每次鼠标点击时被调用 一次 ,因此您可以将不同的点击分成不同的事件。

请注意,还有其他事件函数,例如mouseReleased()mouseClicked()。您可以在 the Processing reference.

中查看它们