首页 > 解决方案 > Java/Processing mousePressed in loop 不工作

问题描述

所以我在 Java + Processing 中制作了一个简单的游戏,其中 draw() 中有按钮和循环。显然,如果有循环,PApplet 函数 mousePressed() 不会持续工作,所以我尝试在循环期间检查自己的 checkmouse() 函数。但是,它仍然不起作用。我如何做到这一点,以便我可以运行带有while循环的游戏并同时不断检查mousePressed?

//draw() func
public void draw() {

    for (int i = 0; i < 10000; i++) {    //to simulate a while loop
        //do something, like run some other functions that create the buttons
        checkmouse();
    }
}

//checkmouse function
public void checkmouse() {

    if (mousePressed) {
        System.out.println("x");
    }
}

当我在处理窗口中单击鼠标时,即使 checkmouse() 每次循环都会运行,它也不会显示“x”,因此理论上它应该在循环运行时不断地检查它。

也有人可以解释为什么这不起作用?

boolean esc = false;
while (!esc) {
    if (mousePressed) {
        System.out.println("x");
        esc = true;
    }
}

标签: javaprocessingevent-dispatch-thread

解决方案


事件变量(mousePressedkeyPressed等)在函数调用之间更新。draw()

换句话说:mousePressed函数在调用函数时永远不会改变draw()draw()如果要更新事件变量,则需要让函数完成然后再次调用。

在幕后,这是因为处理是单线程的。(这是设计使然,因为多线程 UI 程序是一场噩梦。)

退后一步,您可能不想在draw()函数中包含一个长循环。改为利用由 Processing 实现的 60 FPS 循环。


推荐阅读