简体   繁体   English

如何在创建多级游戏时重新启动JFrame?

[英]How to restart a JFrame when creating a multiple level game?

I have a one level computer game that I created , and I want to add another level . 我有一个我创建的单级计算机游戏,我想添加另一个级别。

Here is the 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);
                }
            });
    }
}

This Main function uses the class Renderer , ie 此Main函数使用类Renderer,即

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

And that class holds the first level of the game . 那个班级掌握了游戏的第一级。

As you can see I'm also using JFrame and JOGL 1.0 . 如你所见,我也在使用JFrameJOGL 1.0

My question is : how can I reset the JFrame after I'm done with the 1st level ? 我的问题是:在完成第一级后如何重置JFrame? Obviously I can't use System.exit(0); 显然我不能使用System.exit(0); , since it would quit the entire program . 因为它会退出整个程序。

What I want is to move to another class that holds the 2nd level . 我想要的是转移到另一个拥有第二级的类。

How can I do that without exiting with System.exit(0); 如果不退出System.exit(0);我怎么能这样做System.exit(0); ?

Thanks 谢谢

By using remove() , you can effectively stop the panel. 通过使用remove() ,您可以有效地停止面板。 Then just create a new one JFrame and add() it. 然后只需创建一个新的JFrameadd()它。 Consider making the JFrame creation its own function so you don't have to keep rewriting it if do you this. 考虑使JFrame创建它自己的功能,这样你就不必继续重写它。

well you can use frame.dispose() then create the same JFrame with the next level... 那么你可以使用frame.dispose()然后用下一个级别创建相同的JFrame ...

I suggest you to restructure your code...your Main class should contain only the main method, and from where you should start the game, which would be located in another class containing the JFrame and Thread... 我建议你重新构建你的代码......你的主类应该只包含main方法,并且你应该从哪里开始游戏,它将位于另一个包含JFrame和Thread的类中...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM