Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java小程序游戏循环停止鼠标/键盘输入?_Java_Events_Loops_Input_Mouse - Fatal编程技术网

Java小程序游戏循环停止鼠标/键盘输入?

Java小程序游戏循环停止鼠标/键盘输入?,java,events,loops,input,mouse,Java,Events,Loops,Input,Mouse,我遇到了一个问题,经过大约两个小时的努力,我无法上班。我想有一个循环,可以执行两种方法(绘制和更新),但也可以侦听鼠标/键盘事件。我有一个绘制和更新的循环,但在循环之外什么都不做(听事件)。我尝试了很多事情,但都没有成功。请帮忙 我尝试使用可运行线程,使用不同的命令,使用wait()和notify(),我已经尝试了很多方法。但基本上,我想知道如何运行循环并仍然检查用户输入 另外,当我尝试单击红色的“X”退出程序时,它不会退出,但仍然有效 代码如下: import java.applet.Appl

我遇到了一个问题,经过大约两个小时的努力,我无法上班。我想有一个循环,可以执行两种方法(绘制和更新),但也可以侦听鼠标/键盘事件。我有一个绘制和更新的循环,但在循环之外什么都不做(听事件)。我尝试了很多事情,但都没有成功。请帮忙

我尝试使用可运行线程,使用不同的命令,使用wait()和notify(),我已经尝试了很多方法。但基本上,我想知道如何运行循环并仍然检查用户输入

另外,当我尝试单击红色的“X”退出程序时,它不会退出,但仍然有效

代码如下:

import java.applet.Applet;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class main extends Applet implements MouseListener, Runnable {

    public main() {
        super();
        init();
    }
    Thread t;
    Screen screen = new Screen();
    String Text = "Hello";
    boolean Running = true;
    boolean Click = false;
    int R = 0x00;
    int G = 0x00;
    int B = 0x00;
    int xpoints[] = {25, 40, 40, 25, 25};
    int ypoints[] = {40, 40, 25, 25, 25};
    int npoints = 5;

    public void run() {
        while (Running) {
            GameLoop();
        }
    }

    public void init() {
        this.addMouseListener(this);
        this.setSize(400, 300); //manually set your Frame's size
        t = new Thread(this);
        t.start();
    }

    public void paint(Graphics g) {
        g.setColor(new Color(R, B, G));
        g.fillPolygon(xpoints, ypoints, npoints);
        Running = true;
        t.run();
    }

    public void mousePressed(MouseEvent e) { //On Mouse Click
        System.exit(0);
    }

    public void mouseReleased(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
        System.exit(0);
    }

    public void mouseExited(MouseEvent e) {
    }

    public void mouseClicked(MouseEvent e) {
    }

    public boolean keyDown(Event e, int key) {
        return true;
    }

    public void GameLoop() {
        if (Running) {
            if (R != 0xff) {
                R++;
            } else {
                if (G != 0xff) {
                    G++;
                } else {
                    if (B != 0xff) {
                        B++;

                    } else {
                        System.exit(0);
                    }
                }
            }
            try {
                sleep(20);
            } catch (InterruptedException e) {

                e.printStackTrace();
            }
            paint(getGraphics());
        }
    }

    public void sleep(int time) throws InterruptedException {
        Thread.sleep(time, 0);
    }
}

我看到您在初始化时将运行变量定义为true。此变量用于确定游戏是否应停止。一、 但是,没有看到将此变量的值修改为false的任何地方。这可以解释为什么你的游戏永远不会退出

至于游戏无法运行,请尝试在IDE中调试应用程序。然后,您应该注意抛出了什么异常(如果有),以及您询问的任何变量的值。希望这能让你深入了解应用程序的行为

别忘了用您发现的任何新信息更新我们,这样我们就可以帮助您解决问题。

应该为您的程序的结构提供一些见解。并且对鼠标侦听器很有帮助

您应该解决的问题:
1) 你用
paint
方法做了一些可疑的事情。你为什么在那里调用
t.run()
?线程
t
已经在运行并不断循环调用
paint()
方法来重新绘制屏幕。删除此呼叫,然后查看得到的结果

1) 线程/应用程序的破坏很差。上面的第一个例子提供了一种更好的方法

2) 您拥有您的
系统。在
鼠标按下()
上退出(0)
,并在
鼠标按下()
中添加注释。。。它起作用,但它的坏习惯

3) 将类命名为
main
是非常糟糕的惯例,既令人困惑又不切实际。将类重命名为“游戏”或类似的名称


4) 如果不使用,为什么要声明
屏幕

可以显示代码吗?我理解,但如果您显示代码,我会理解更多。:)我们需要更多关于您已经尝试过的内容的信息。如果您正确地编写了GUI,那么您已经处于事件处理循环中,您不需要做任何其他事情,只需要注册您感兴趣的事件(在本例中为鼠标/键盘),然后在启动注册方法时执行一些有用的操作。但是,您应该使用SwingUtilities通过其方便的invokeLater方法将屏幕刷新(绘制/更新)委托给另一个线程。如果你需要详细的帮助,你应该发布一些代码。真的很奇怪,1)修复了它,尽管我记得用它尝试了一切…我昨天可能太累了,谢谢你,你的应用程序坏了什么?知道这一点很好,因为这对我来说是一种冒险,哈哈。