Java-игра открывает 5 оконJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java-игра открывает 5 окон

Сообщение Anonymous »

Здравствуйте, сейчас я разрабатываю игру для моего слепого брата и его друзей. Изначально им не нужен был пользовательский интерфейс (слепой), но у них есть зрячие друзья, которые тоже хотят играть.
Коротко говоря, я пытался использовать 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();
});
}

}
Я пытался использовать отладчик, но это не сработало, поскольку отладчик застрял в классе Thread.

Подробнее здесь: https://stackoverflow.com/questions/784 ... -5-windows
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»