鼠标按下事件两次

时间:2015-06-10 13:42:30

标签: mouseevent processing

以下代码无法正常工作,我想要发生的是用鼠标按下调用placement_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;

}

2 个答案:

答案 0 :(得分:1)

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

要做的就是使用函数mousePressed()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.cc here

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;
    }

答案 1 :(得分:0)

  

我希望第二次鼠标按下与第一次分开。

考虑使用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中查看它们。