【问题标题】:Java Applet Game Loop stops Mouse/Keyboard Input?Java Applet 游戏循环停止鼠标/键盘输入?
【发布时间】:2011-07-08 18:19:29
【问题描述】:

在尝试了大约 2 小时后,我遇到了一个无法上班的问题。我想要一个循环来执行 2 种方法(绘制和更新),但还要听鼠标/键盘事件。我有一个绘制和更新的循环,但在循环之外什么都不做(监听事件)我尝试了很多东西,但没有任何效果。请帮忙?

我尝试使用 Runnable Thread,使用不同的命令,使用 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);
    }
}

【问题讨论】:

  • 你能显示代码吗?我了解,但如果您显示代码,我会了解更多。 :)
  • 我们需要更多关于您已经尝试过的信息。
  • 如果您正确编写了 GUI,那么您已经处于事件处理循环中,您无需执行任何其他操作,只需注册您感兴趣的事件(在本例中为鼠标/键盘),然后在您注册的方法启动时做一些有用的事情。但是,您应该使用 SwingUtilities 通过其方便的 invokeLater 方法将屏幕刷新(绘制/更新)委托给另一个线程。如果您需要详细的帮助,您应该发布一些代码。

标签: java events loops input mouse


【解决方案1】:

This tutorial 应该提供一些关于如何构建程序的见解。而this one 对鼠标监听器很有帮助。

您应该解决的问题:
1) 你正在用paint 方法做一些可疑的事情。你为什么在那里打电话给t.run()?线程t 已经在运行并不断循环调用paint() 方法来重绘屏幕。删除这个电话,看看你会得到什么。

1) 你的线程/应用程序的破坏很差。上面的第一个示例提供了一种更好的方式来实现这一点

2) 你在 mousePressed() 上有你的 System.Exit(0) 和评论 //on mouse click 但在 mouseClicked() 中没有任何内容...它有效,但它的约定不好

3) 将您的班级命名为main 是非常糟糕的约定,既令人困惑又不切实际。将您的课程重命名为“游戏”或类似名称。

4) 如果不使用Screen,为什么要声明它?

【讨论】:

  • 真的很奇怪,1) 修复了它,尽管我记得尝试了所有的东西...我昨天可能太累了,非常感谢
  • 这就是您的应用程序的问题吗?很高兴知道,因为那是代表我在黑暗中开枪哈哈。
【解决方案2】:

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

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

不要忘记向我们提供您发现的任何新信息,以便我们一路为您提供帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 2019-03-21
    • 2011-08-20
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多