创建多级游戏时如何重新启动JFrame? [英] How to restart a JFrame when creating a multiple level game?

查看:73
本文介绍了创建多级游戏时如何重新启动JFrame?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个单关电脑游戏,我想添加另一个关卡.

I have a one level computer game that I created , and I want to add another level .

这里是主要:

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);
                }
            });
    }
}

此Main函数使用Renderer类,即

This Main function uses the class Renderer , i.e.

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

该班级拥有比赛的第一关.

And that class holds the first level of the game .

如您所见,我也在使用JFrameJOGL 1.0.

As you can see I'm also using JFrame and JOGL 1.0 .

我的问题是:在完成第1级操作后,如何重置JFrame?显然我不能使用System.exit(0);,因为它会退出整个程序.

My question is : how can I reset the JFrame after I'm done with the 1st level ? Obviously I can't use System.exit(0); , since it would quit the entire program .

我想要的是转移到另一个拥有2级水平的课程.

What I want is to move to another class that holds the 2nd level .

如何在不退出System.exit(0);的情况下执行此操作?

How can I do that without exiting with System.exit(0); ?

谢谢

推荐答案

通过使用

By using remove(), you can effectively stop the panel. Then just create a new one JFrame and add() it. Consider making the JFrame creation its own function so you don't have to keep rewriting it if do you this.

这篇关于创建多级游戏时如何重新启动JFrame?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆