Коротко говоря, я пытался использовать Swing для сборки пользовательский интерфейс в игре. В некотором смысле это работает, но в настоящее время я столкнулся с проблемой, когда открыто несколько окон приложений. Когда я запускаю приложение, у него есть один фрейм пользовательского интерфейса. Как только игрок нажимает кнопку «Начать игру», появляются еще 4 окна. Я не могу понять, почему. Я попытался использовать отладчик, однако это не сработало, поскольку отладчик застрял в классе Thread. У меня более 25 классов, но эта проблема, похоже, связана с классом Engine (основной). Игра запускается из класса Engine https://pastebin.com/wgktAAx3, а затем переносит игрока в класс Game https://pastebin.com/6dbRbpmc. Моя игра многопоточная, так как в ней есть игровые часы, а также другие функции, требующие собственного потока. Мы будем очень признательны за любую помощь.
Вот код двигателя
Код: Выделить всё
package gameEngine;
class GameTrack extends Thread {
private Clip clip;
SoundEffects soundEffect = new SoundEffects();
public void playMusic(int i) {
soundEffect.setFile(i);
soundEffect.play();
soundEffect.loop();
}
public void stopMusic() {
soundEffect.stop();
}
public void playSE(int i) {
soundEffect.setFile(i);
soundEffect.play();
}
}
/*
* class gameTime extends Thread{
*
* Clock clock = new Clock();
*
* public void startGameTime() { Boolean run = true;
*
* while(run==true) { clock.time(); }
*
* }
*
* }
*/
public class Engine{
static Game game;
JFrame window;
Container con;
JPanel titleNamePanel, startButtonPanel, mainTextPanel;
JLabel titleNameLabel;
Font titleFront = new Font("Times New Roman", Font.PLAIN, 30);
Font normalFont = new Font ("Times New Roman", Font.PLAIN, 30);
JButton startButton;
public JTextArea mainTextArea;
private GameIO gameIO;
private static Engine instance;
private JFrame frame;
public static void saveGame() {
try {
FileOutputStream fos = new FileOutputStream("Adv.sav");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(game);
oos.flush();
oos.close();
System.out.println("Game saved\n");
}catch (Exception e) {
System.out.println("Serialization Error! Can't save data!\n"+e.getMessage()+"\n");
}
}
public static void loadGame() {
try {
FileInputStream fis = new FileInputStream("Adv.sav");
ObjectInputStream ois = new ObjectInputStream(fis);
game = (Game) ois.readObject();
ois.close();
System.out.println("Game Loaded\n");
}catch (Exception e) {
System.out.println("Serialization Error! Can't load data!\n"+e.getMessage()+"\n");
}
}
public Engine() {
initializeUI();
}
public static Engine getInstance() {
if (instance == null) {
synchronized (Engine.class) {
if (instance == null) {
instance = new Engine();
}
}
}
return instance;
}
private void initializeUI() {
frame = new JFrame("Galactic Conflict");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
JPanel mainPanel = new JPanel(new BorderLayout());
mainPanel.setBackground(Color.DARK_GRAY);
Border yellowBorder = new CompoundBorder(new LineBorder(Color.WHITE, 10), new LineBorder(Color.BLACK, 10));
mainPanel.setBorder(yellowBorder);
JTextArea middleBox = new JTextArea();
middleBox.setEditable(false);
middleBox.setBackground(Color.BLACK);
middleBox.setForeground(Color.GREEN);
middleBox.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 16));
Border middleBorder = new CompoundBorder(new LineBorder(Color.WHITE, 10), new LineBorder(Color.BLACK, 1));
middleBox.setBorder(middleBorder);
JScrollPane scrollPane = new JScrollPane(middleBox);
mainPanel.add(scrollPane, BorderLayout.CENTER);
GameIO.redirectOutput(middleBox);
JPanel leftPanel = new JPanel(new GridLayout(2, 1, 10, 10));
leftPanel.setBackground(Color.DARK_GRAY);
leftPanel.setBorder(new LineBorder(Color.WHITE, 10));
mainPanel.add(leftPanel, BorderLayout.WEST);
JTextField userInputBox = new JTextField();
userInputBox.setBackground(Color.DARK_GRAY);
userInputBox.setForeground(Color.WHITE);
userInputBox.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 16));
Border userInputBorder = new CompoundBorder(new LineBorder(Color.WHITE, 10), new LineBorder(Color.BLACK, 1));
userInputBox.setBorder(userInputBorder);
userInputBox.addActionListener(e -> {
middleBox.append(userInputBox.getText() + "\n");
userInputBox.setText("");
});
mainPanel.add(userInputBox, BorderLayout.SOUTH);
frame.add(mainPanel);
frame.setVisible(true);
JButton startGameButton = new JButton("Start Game");
startGameButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Start the game on a new thread to avoid blocking the EDT
new Thread(() -> {
if (game == null) {
game = new Game();
}
game.startGame();
}).start();
}
});
mainPanel.add(startGameButton, BorderLayout.NORTH);
}
public static void main(String[] args) throws IOException {
// new Engine();
//Game game = new Game();
//game.startGame();
SwingUtilities.invokeLater(() -> {
Engine.getInstance();
});
}
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... -5-windows
Мобильная версия