以下代码无法正常工作,我想要发生的是用鼠标按下调用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;
}
答案 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中查看它们。