我遇到了一个问题,经过大约2个小时的努力,我无法上班。我想有一个循环,可以执行2个方法(绘制和更新),但也可以监听鼠标/键盘事件。我有一个Draws和Updates循环,但在循环之外什么都不做(听事件)我尝试了很多东西但没有任何效果。请帮帮忙?
我尝试使用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);
}
}
答案 0 :(得分:1)
This tutorial应该提供一些关于如何构建程序的见解。 this one对鼠标监听器很有帮助。
您应该解决的问题:
1)你使用paint
方法做了一些可疑的事情。你为什么在那里打电话给t.run()
?线程t
已在运行并循环,不断调用paint()
方法重绘屏幕。删除此电话,看看你得到了什么。
1)您的线程/应用程序的破坏很差。上面的第一个例子提供了一种更好的方法
2)System.Exit(0)
mousePressed()
的评论为//on mouse click
mouseClicked()
但main
中没有任何内容......但它的工作原理不正确
3)让你的班级名为Screen
是非常糟糕的惯例,既令人困惑又不切实际。将您的课程重命名为“游戏”或类似内容。
4)如果您不使用它,为什么要声明{{1}}?
答案 1 :(得分:0)
我看到你在初始化时将Running变量定义为true。此变量用于确定游戏是否应该停止。但是,我没有看到您将此变量的值修改为false的任何位置。这可以解释为什么你的游戏永远不会退出。
至于游戏无效,请尝试在IDE中调试应用程序。然后,您应该注意抛出异常(如果有),以及您要质疑的任何变量的值。希望这能让您深入了解应用的行为。
不要忘记更新我们发现的任何新信息,以便我们可以帮助您。