2013-08-07 3 views
0

У меня есть компьютерная игра на одном уровне, которую я создал, и я хочу добавить еще один уровень.Как перезапустить JFrame при создании многоуровневой игры?

Вот Main:

public class Main extends JDialog 
{ 

    private static final long serialVersionUID = 1L; 
    protected static TimerThread timerThread; 
    static JStatusBar statusBar = new JStatusBar(); 
    private static JFrame frame; 
    private static final int FRAME_LOCATION_X = 300; 
    private static final int FRAME_LOCATION_Y = 50; 
    private static final int FRAME_SIZE_X = 850; // animator's target frames per second 
    private static final int FRAME_SIZE_Y = 700; // animator's target frames per second 
    private static final String WorldName = "FPS 2013 CG Project"; 
    private static final String HARD_TARGET = "src/res/target.jpg"; 
    private static final String runningOut = "Time is running out - you have : "; 

    static int interval; 
    static Timer timer1; 
    static JLabel changingLabel1 = null; 


    /** 
    * NEW 
    */ 

    private static Timer timer; 
    private static int count = 60; 

    private static ActionListener timerAction = new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 
      count--; 
      if (count == 0) 
       timer.stop(); 
      changingLabel1.setText(runningOut + count + " seconds"); 
     } 
    }; 


    public static void exitProcedure() { 
     timerThread.setRunning(false); 
     System.exit(0); 
    } 


     /** 
     * Clock timer1 
     * @author X2 
     * 
     */ 
     public static class TimerThread extends Thread 
     { 

      protected boolean isRunning; 

      protected JLabel dateLabel; 
      protected JLabel timeLabel; 

      protected SimpleDateFormat dateFormat = 
        new SimpleDateFormat("EEE, d MMM yyyy"); 
      protected SimpleDateFormat timeFormat = 
        new SimpleDateFormat("h:mm a"); 

      public TimerThread(JLabel dateLabel, JLabel timeLabel) { 
       this.dateLabel = dateLabel; 
       this.timeLabel = timeLabel; 
       this.isRunning = true; 
      } 

      @Override 
      public void run() { 
       while (isRunning) { 
        SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          Calendar currentCalendar = Calendar.getInstance(); 
          Date currentTime = currentCalendar.getTime(); 
          dateLabel.setText(dateFormat.format(currentTime)); 
          timeLabel.setText(timeFormat.format(currentTime)); 
         } 
        }); 

        try { 
         Thread.sleep(5000L); 
        } catch (InterruptedException e) { 
        } 
       } 
      } 

      public void setRunning(boolean isRunning) { 
       this.isRunning = isRunning; 
      } 

     } 




    public static void main(String[] args) 
    { 

      SwingUtilities.invokeLater(new Runnable() 
      { 
       @Override 
       public void run() 
       { 

        frame = new JFrame(WorldName); 

        Container contentPane = frame.getContentPane(); 
        contentPane.setLayout(new BorderLayout()); 

        /** 
        * the timer of the count-down 
        */ 

        timer = new Timer(1000, timerAction); 
        timer.start(); 

        changingLabel1 = new JLabel(runningOut); 
        statusBar.setLeftComponent(changingLabel1); 

        final JLabel dateLabel = new JLabel(); 
        dateLabel.setHorizontalAlignment(JLabel.CENTER); 
        statusBar.addRightComponent(dateLabel); 

        final JLabel timeLabel = new JLabel(); 
        timeLabel.setHorizontalAlignment(JLabel.CENTER); 
        statusBar.addRightComponent(timeLabel); 

        contentPane.add(statusBar, BorderLayout.SOUTH); 

        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
        frame.addWindowListener(new WindowAdapter() { 
         @Override 
         public void windowClosing(WindowEvent event) { 
          exitProcedure(); 
         } 
        }); 

        timerThread = new TimerThread(dateLabel, timeLabel); 
        timerThread.start(); 

        Renderer myCanvas = new Renderer(); 
        final Animator animator = new Animator(myCanvas); 

        Toolkit t = Toolkit.getDefaultToolkit(); 
        BufferedImage originalImage = null; 

        try 
        { 
         originalImage = ImageIO.read(new File(HARD_TARGET)); 
        } 

        catch (Exception e1) {e1.printStackTrace();} 
        Cursor newCursor = t.createCustomCursor(originalImage, new Point(0, 0), "none"); 

        frame.setCursor(newCursor); 
        frame.setLocation(FRAME_LOCATION_X, FRAME_LOCATION_Y); 
        frame.add(myCanvas); 
        frame.setSize(FRAME_SIZE_X, FRAME_SIZE_Y); 
        frame.addWindowListener(new WindowAdapter() 

        { 
         @Override 
         public void windowClosing(WindowEvent e) 
         { 
          new Thread() 
          { 
           @Override 
           public void run() 
           { 
            animator.stop(); 
            System.exit(0); 
           } 
          }.start(); 
         } 
        }); 

        frame.setVisible(true); 
        animator.start(); 
        myCanvas.requestFocus(); 
        myCanvas.setFocusable(true); 
       } 
      }); 
    } 
} 

Это Основная функция использует класс Renderer, т.е.

class Renderer extends GLCanvas implements GLEventListener, KeyListener ,MouseListener ,MouseMotionListener {...} 

И этот класс имеет первый уровень игры.

Как вы можете видеть, я также использую JFrame и JOGL 1.0.

Мой вопрос: как я могу сбросить JFrame после того, как я закончил с 1-го уровня? Очевидно, я не могу использовать System.exit(0);, так как он оставил бы всю программу.

Я хочу перейти к другому классу, который содержит 2-й уровень.

Как я могу это сделать без выхода с System.exit(0);?

Благодаря

+0

Почему бы просто не дать ему новый рендерер, когда вы закончите с первого уровня? –

+1

Просто попробуйте использовать JPanel для каждого уровня. Когда уровень завершен, вы можете отправить некоторое событие в JFrame, чтобы перейти на JPanel следующего уровня. – dic19

ответ

1

Используя remove(), вы можете эффективно остановить панель. Затем просто создайте новый JFrame и add(). Подумайте о том, чтобы создать JFrame свою собственную функцию, чтобы вам не пришлось переписывать ее, если вы это делаете.

1

хорошо вы можете использовать frame.dispose() затем создать то же JFrame с следующим уровнем ...

Я предлагаю вам перестроить свой код ... Ваш Основной класс должен содержать только основной метод, а откуда вы должны начать игру, которая будет расположена в другом классе, содержащем JFrame и Thread ...