2014-01-25 235 views
0

当用户按下“新游戏”按钮时,我无法重新启动2D游戏。重新启动2D游戏

我的游戏结构:

游戏中有几个“屏幕”:开屏,说明屏,游戏主画面和游戏结束画面。

每个屏幕都是一个类的实例:OpeningScreen类,GameScreen类等

有一个名为Main类。这个班有三个角色。

  • 这是程序的JFrame(窗口)。
  • 它有主要方法 - 第一类运行。
  • 它有一种改变屏幕的方法。

当程序启动时,这个类运行。当它第一次运行时:

  1. 创建自己的新实例(它是一个JFrame类型的类)。
  2. 创建每个“屏幕级”的实例。每个'screen-class'的构造函数都将Main的实例作为参数:(aka:GameOverScreen gameOverScreen = new GameOver(this))。
  3. 创建一个名为mainPanel的新JPanel,并将其添加到JFrame中。任何要显示的屏幕都将包含在此JPanel中(屏幕也是JPanel类型的)。

的changeScreen()方法的工作原理:

changeScreen的签名()是这样的:changeScreen(JPanel from, JPanel to)

每当屏幕需要更改时,显示的当前屏幕会调用此方法,如下所示:main.changeScreen(this, main.InstructionsScreen)。它会从mainPanel中删除前一个屏幕,并将新屏幕添加到mainPanel。如上所述,这些屏幕是在程序启动时创建的。

这是改变屏幕的方法:

public void changeScreen(JPanel from, JPanel to){ 

    mainPanel.remove(from); 
    mainPanel.add(to); 

    mainPanel.revalidate(); 
    mainPanel.repaint(); 

} 

我的问题:游戏结束

后,游戏类调用changeScreen方法:main.changeScreen(this, main.GameOverScreen)

这将游戏屏幕替换为屏幕上的游戏。 按下游戏结束画面中的“新游戏”按钮,请致电main.changeScreen(this, main.GameScreen)

问题:按下游戏结束画面中的“新建游戏”按钮,确实会再次显示Game类的实例。但这是旧的情况,所以游戏不会重新启动。它已经完成了。

我试着做下面的变化changeScreen()

public void changeScreen(JPanel from, JPanel to){ 

    mainPanel.remove(from); 

    if(to.equals(gameScreen)){ 
     gameScreen = null; 
     gameScreen = new GameScreen(this); 
    } 
    mainPanel.add(gameScreen); 

    mainPanel.revalidate(); 
    mainPanel.repaint(); 

} 

这应该重置gameScreen对象。 但是当按下“新游戏”按钮时,这会造成大约10秒的延迟。

什么是重新启动游戏的好方法?

谢谢

回答

0

您必须删除子/实例。猜测这是Actionscript 3你应该做removeChild,然后让这个孩子为空。试试看。