Как сделать, чтобы при проигрыше игра высвечивала начальную меню?

Рейтинг: -1Ответов: 1Опубликовано: 05.02.2023

Есть игра в машинки. Нужно, чтобы когда машины врезались, открывалось новое окно, а старое окно закрывалось со своими потоками.

Но когда я пишу 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);

            }
        }
}

Ответы

▲ 0

Для того, чтобы закрыть только старое окно, вы можете создать новый экземпляр JFrame в текущем потоке, а затем использовать метод setVisible(false) для текущего окна, чтобы сделать его невидимым, вместо вызова System.exit(1).

JFrame newFrame = new JFrame();
// Настройка нового окна

// Сделать текущее окно невидимым
setVisible(false);

// Отобразить новое окно
newFrame.setVisible(true);