鼠标按下事件调用两次
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.
中查看它们
以下代码无法正常工作,我想要发生的是用鼠标按下调用 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.