Как сделать, чтобы при проигрыше игра высвечивала начальную меню?
Есть игра в машинки. Нужно, чтобы когда машины врезались, открывалось новое окно, а старое окно закрывалось со своими потоками.
Но когда я пишу new JFrame();
и System.exit(1);
закрывается и старое окно, и новое окно. Как сделать, чтобы закрывалось только старое?
Вот класс Road
:
import javax.swing.*;
import javax.swing.Timer;
import java.awt.*;
import java.awt.Image;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.util.List;
public class Road extends JPanel implements ActionListener,Runnable {
//создание таймера который каждые 20мс перерисовывает изображение
Timer maintimer = new Timer(20, this);
Image img = new ImageIcon
("resources/imgonline-com-ua-Resize-8fUGtrukPs.jpg").getImage();
Player p = new Player();
int score;
int money;
//создание потока который делает this
Thread enemmiesFactory = new Thread(this);
Thread audio = new Thread(new Audio());
List<Enemy> enemies = new ArrayList<Enemy>();
//Создание коллекции для врагов
public Road() {
maintimer.start(); //запуск таймера
enemmiesFactory.start(); //Запуск потока который создает врагов
audio.start();
addKeyListener(new myKeyAdapter());//слушатель кнопок
setFocusable(true);// что бы все работало
}
@Override
public void run() {
while (true) {
Random random = new Random();
try {
Thread.sleep(1500);
enemies.add(new Enemy(2000, random.nextInt(600), random.nextInt(60), this));///добавление в рандомном порядке врагов
score++; // счет увеличивается с каждым разом как появляется враг
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
private class myKeyAdapter extends KeyAdapter {
public void keyPressed(KeyEvent e) {
p.keyPressed(e);
}// обработчик нажатия кнопки
public void keyReleased(KeyEvent e) {
p.keyReleased(e);
}// обработчик отпускания кнопки
}
public void paint(Graphics g) {//рисование всех обьектов
g = (Graphics2D) g;
g.drawImage(img, p.layer1, 0, null);
g.drawImage(img, p.layer2, 0, null);
g.drawImage(p.img, p.x, p.y, null);
double v = 200 / Player.MAX_V * p.v;//вычесление скорости
g.setColor(new Color(0, 0, 0));
Font font = new Font("Arial", Font.ITALIC, 40);
g.setFont(font);
g.drawString("Скорость : " + v + " КМ/ч", 100, 50);
g.setColor(new Color(0, 0, 0));
Font font1 = new Font("Arial", Font.ITALIC, 40);
g.setFont(font1);
g.drawString("Счёт :" + score, 600, 50);
Font font2 = new Font("Arial", Font.ITALIC, 40);
g.setFont(font2);
g.drawString("Деньги :" + money, 1000, 50);
Date date = new Date();
Iterator<Enemy> iterator = enemies.iterator(); // Итератор стоит во главе всех коллекций, служит для перебора коллекций
while (iterator.hasNext()) {//цикл который савнит наших врагов, и удаляет как только они отдалятся от нас на 2400
Enemy e = iterator.next();
if (e.x >= 2400 || e.x <= -2400) {
iterator.remove();
} else {
e.move();
g.drawImage(e.img, e.x, e.y, null);
}
}
}
@Override
public void actionPerformed(ActionEvent e) {// выполнение того самого этого
p.move();
repaint();
try {
testCollitionWithEnemies();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
addMony();
}
private void testCollitionWithEnemies() throws IOException {// проверка на столкновение
Iterator<Enemy> iterator = enemies.iterator();
while (iterator.hasNext()) {
Enemy e = iterator.next();
if (p.getRect().intersects(e.getRect())) {
BufferedReader br = null;
try {
File file = new File("resources/newFile.txt");
PrintWriter pw = new PrintWriter(file);
pw.println(score);
pw.close();
br = new BufferedReader(new FileReader("resources/newFile.txt"));
String line = br.readLine();
System.out.println(line);
int scored = Integer.parseInt(line);
System.out.println(scored);
if(score>scored){
pw.print(score);
pw.close();
}
pw.close();
}
catch (IOException ee){
System.out.println("Error"+ ee);
}
maintimer.stop();
audio.interrupt();
JOptionPane.showMessageDialog(null,"Вы проиграли");
new MainFrame();
}
}
}
private void addMony() {//Добавление денег на счет помощь бездомным животным
Iterator<Enemy> iterator = enemies.iterator();
while (iterator.hasNext()) {
Enemy e = iterator.next();
if (p.getRectForMoney().intersects(e.getRectForMoney())) {
money+=10;
}
}
}
}
Вот класс Main
:
import javax.swing.*;
public class Main extends JFrame {
JFrame frame = new JFrame("Гонки");
Main(){
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.add(new Road());
frame.setVisible(true);
Road p = new Road();
if(p.maintimer.isRunning() == false){
frame.setVisible(false);
}
}
}
Источник: Stack Overflow на русском