好的,所以我正在尝试使用JavaFX使用GUI制作基于文本的游戏。在我进入实际的游戏循环之前,一切都很好。虽然一旦我将编码放入游戏循环中,程序就无法启动。它会运行没有错误或异常,但窗口根本不会弹出。当我关闭窗口时,IntelliJ中的所有命令行都是“处理完成后退出代码130”,这显然意味着程序已关闭,因为用户按下Ctrl + C.事实并非如此,因为窗口甚至没有弹出,所以任何用户都无法单击Ctrl + C来终止程序。所以我的问题是我能做什么才能用游戏循环(循环)运行我的程序,而窗口不会弹出。这是我的代码:
<?php
$xml=simplexml_load_file("d2ladder.xml") or die("Error: Cannot create object");
?>
<table width="100%" border="1" cellspacing="0" cellpadding="2" align="center" style="text-align:center">
<tbody>
<tr class="<?php if ($xml->ladder[12]->char[0]->status == "alive") { echo "alive"; } else { echo "dead"; } ?>">
<td width="10%">1.</td>
<td width="50%" style="text-align:left"><?php echo $xml->ladder[12]->char[0]->prefix; ?> <?php echo $xml->ladder[12]->char[0]->name; ?></td>
<td width="10%"><?php echo $xml->ladder[12]->char[0]->class; ?></td>
<td width="10%"><?php echo $xml->ladder[12]->char[0]->level; ?></td>
<td width="20%"><?php echo $xml->ladder[12]->char[0]->experience; ?></td>
</tr>
<tr class="<?php if ($xml->ladder[12]->char[1]->status == "alive") { echo "alive"; } else { echo "dead"; } ?>">
<td width="10%">2.</td>
<td width="50%" style="text-align:left"><?php echo $xml->ladder[12]->char[1]->prefix; ?> <?php echo $xml->ladder[12]->char[1]->name; ?></td>
<td width="10%"><?php echo $xml->ladder[12]->char[1]->class; ?></td>
<td width="10%"><?php echo $xml->ladder[12]->char[1]->level; ?></td>
<td width="20%"><?php echo $xml->ladder[12]->char[1]->experience; ?></td>
</tr>
</tbody>
</table>
答案 0 :(得分:1)
这不应该是游戏循环。按钮单击会触发事件。它应该在那里处理。没有必要一次又一次地更新按钮文本,这就是您目前正在做的事情。
通过在那里执行循环,您可以阻止应用程序线程,该线程负责重绘和处理用户交互,从而无法完成任务。
将您的代码折射为基于事件的,即
用户交互(按钮点击)触发ui更新(状态更改和UI的单次更新)。
E.g。像这样的东西:
public class Game {
...
public void gameStart(){
...
// setting up the scene
scene = new Scene(window, 800, 600);
// adding css
scene.getStylesheets().add(this.getClass().getResource("game.css").toExternalForm());
setLevel("Storyline");
}
public void setLevel(String newLevel) {
// TODO: integrate gameOn value
if (newLevel != null && !newLevel.equals(levels)) {
levels = newLevel;
switch (levels) {
case "Storyline":
btn1.setText("search around");
btn2.setText("turn the light on");
btn3.setText("stand in fear");
// user interaction triggers setting the level
btn2.setOnAction(e -> setLevel("level1"));
break;
case "level1":
topText.setText("You turned the light on");
break;
}
}
}
...
}
其他建议:不要将级别表示为String
,将其表示为实现接口的实例:
public interface Level {
// do updates for level start on game
void updateGameLevelStart(Game game);
// cleanup code e.g. unregistering event handlers...
void updateGameLevelEnd(Game game);
}
这样您就可以将levels
的类型更改为Level
并简化更新:
public void setLevel(Level newLevel) {
if (!Objects.equals(levels, newLevel)) {
if (levels != null) {
// cleanup old level
levels.updateGameLevelEnd(this);
}
levels = newLevel;
if (newLevel != null) {
// start new level
newLevel.updateGameLevelStart(this);
}
}
}
这当然要求您使用Level
实现可以访问ui的相关部分。