我正在 NetBeans 中创建一个简单的回合制游戏。 GUI 初始化后,它调用函数 HerosTurn() 等待用户选择,并从单独的 Hero 类创建该选择的结果。当我在 Debug模式下单步执行代码时,我会得到正确的结果,但如果我只是运行代码,则不会将任何内容附加到文本区域,除非我让等待函数在等待输入时不断附加文本。我见过类似的其他问题,但它们都涉及多线程,我不相信这就是我正在做的事情。任何帮助将不胜感激。
这是主类:
package Flow;
import Forms.Battleinterface;
/**
*
* @author Steemo
*/
public class battle {
public static int hAct;
public static int gLife = 200;
public static void herosTurn() {
hAct = 0;
Forms.Battleinterface.biText.append("What will you do?");
while (hAct == 0){
// adding the line below makes code work but is ugly.
//Forms.Battleinterface.biText.append(".");
continue;
}
if (hAct == 1){
Entities.Hero.attack();
}
}
public static void main(String args[]) {
Battleinterface battleinterface = new Forms.Battleinterface();
Battleinterface.Start();
while (gLife > 0) {
herosTurn();
}
}
}
这是位于单独包中的 Hero() 类:
package Entities;
import java.util.Random;
/**
*
* @author Steemo
*/
public class Hero {
static Random hGen = new Random(54154454);
public static void attack() {
int hAtt = 0;
hAtt = hGen.nextInt(6) + 15;
Forms.Battleinterface.biText.append("\nYou swing your axe and do " + hAtt
+ " Damage!!!");
}
}
我没有附加用于生成 GUI(Battleinterface)的类,因为 GUI 生成得很好,唯一发生的其他事情是输入 hAct 的传递。 如果需要的话我可以附上。
最佳答案
替换此代码...
while (hAct == 0){
continue;
}
...用这个代替:
while (hAct == 0){
try {
Thread.yield();
} catch (InterruptedException interruptedEx) {
// Log the interruption somewhere.
}
}
假设您在某种程度上使用 AWT/Swing?这是一个无限循环,阻止其他线程运行。通过这样做,您永远不会让 UI 线程实际执行任何更新,这意味着它似乎挂起。您可能没有自己执行任何线程,但 AWT/Swing 内置了线程来执行各种功能,并且它们需要定期获取 CPU 时间来完成其工作。
这在调试中有效的原因是,当您单步执行 herosTurn
方法时,调试器会暂停该方法,从而允许 UI 线程进行更新(包括从用户获取输入),但当只是运行游戏时,herosTurn
方法永远不会暂停,并且该方法占用了应用 100% 的可用 CPU 时间。
最后,如Mike Clark提到过,你通常不应该编写带有无限循环的 UI。相反,您定义触发事件的组件。您的代码会收到这些事件的通知并做出适当的 react 。这就是所谓的 UI 事件模型。如果您使用的是 Swing,有关在事件模型中工作的介绍性信息 is covered here .
我通常也不会在游戏中使用 AWT/Swing,因为 UI 编码、渲染性能的复杂性,以及与 AWT/Swing 并不是为游戏而构建的良好工具相关的其他几个原因。话虽如此,如果您愿意深入研究 UI 代码来完成回合制游戏,那么除了我在 a previous answer 中概述的其他一些原因之外,回合制游戏也可以通过这种方式正常工作(因为渲染性能要求通常要低得多)。 .
关于java - UI 在 Debug模式下按预期更新,但在正常运行时不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9689511/