gpt4 book ai didi

java - 如何在 Java 中实现一个好的游戏菜单?

转载 作者:行者123 更新时间:2023-11-30 11:56:16 26 4
gpt4 key购买 nike

我在大学时代就开始从事 Java 游戏开发已有一段时间了。由于我的职业生涯而休息了很长时间之后,我又回到了它并意识到代码是多么糟糕。我基本上在同一个类文件中有一个具有 GUI 和游戏逻辑的“整体主体”。我正在尝试做的是将 GUI 抽象和“组件化”为更小的 block 。我执行的类扩展了 JFrame,我在单击按钮时将面板添加到/从中删除。例如。

public class GameFrame extends JFrame{
private JPanel[] _panels = {new MainPanel(), new OptionsPanel(), new DifficultyPanel()};
private int _currentPanelIndex = 0;
public GameFrame(){
...
add(_panels[_currentPanelIndex]);
...
}
}

在每个面板类中,我都有用于按钮的私有(private) ActionListeners。在 MainPanel 中,我正在获取单例 GameFrame 实例并设置当前面板,类似于:

class SinglePlayerButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e){
GameFrame instance = GameFrame.getInstance();
JPanel[] panels = instance.getPanels();
int currentPanelIndex = instance.getCurrentPanelIndex();
instance.remove(panels[currentPanelIndex]);
int newPanelIndex;
for(newPanelIndex = 0; newPanelIndex < panels.length; newPanelIndex++){
if(panels[newPanelIndex] instanceof DifficultyPanel){
break;
}
}
instance.add(panels[newPanelIndex]);
}
}

我不喜欢我的类(class)中这种深度耦合,但我可以接受。然而,真正的问题是当我点击最后一个让我进入游戏的按钮时,我不能:

public void actionPerformed(ActionEvent e){
GameFrame.getInstance().startGame();
}

因为这会导致我的游戏在 Java Event 线程中运行,从而禁止处理任何其他事件。以前,我有一个忙的 while 循环:

...
while(waiting){
//Do nothing
}
remove(_panels[_currentPanelIndex]);
startGame();
...
...
public void actionPerformed(ActionEvent e){
waiting = false;
}

让我的 GameFrame 类知道我点击了播放按钮的最佳方式是什么?我可以从它的子面板之一向它发送一个事件或消息,告诉它开始吗?如果可以,我如何阻止游戏在事件线程中运行?我应该在 actionPerformed() 方法中处理它并简单地生成一个新线程吗?我宁愿将它保留在主线程中。谢谢。

最佳答案

寻找Slick 2D (一个轻量级的 OpenGL 2D 游戏开发框架,有很多很酷的东西)或 Nifty-GUI .

Slick 也有一些示例和教程,并且很容易学习,例如 StateBasedGame 可以很容易地用于实现多个游戏内菜单(如主菜单、设置菜单、游戏内选项、游戏内暂停/恢复等)

关于java - 如何在 Java 中实现一个好的游戏菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4589008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com