2016-11-30 77 views
2

我們創建了一個迷宮遊戲,玩家需要按特定順序收集密鑰才能獲勝。在遊戲結束時,如果玩家未按照特定順序收集密鑰,玩家可以選擇重新啓動(按R)或退出(按Q)遊戲。重新啓動java遊戲時出現問題

問題是當玩家選擇重新啓動時,會彈出一個新遊戲,是的,但舊的或以前的遊戲仍在運行。

這裏是Launcher類:

public class Launcher { 
public static void main(String[] args) throws Exception{ 

    Game game = new Game("DUNGEON ESCAPE", 500,500); 
    game.start(); 

    AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File("C:\\Users\\user\\Documents\\NetBeansProjects\\ThisMaze\\src\\OurMaze\\BGM.wav")); 
    Clip clip = AudioSystem.getClip(); 
    clip.open(inputStream); 
    clip.loop(Clip.LOOP_CONTINUOUSLY); 
    Thread.sleep(10000000); 

} 

這裏是一個代碼,如果玩家收集鑰匙的正確順序,並調用WrondEndState如果玩家是錯誤的(這位於Inventory類檢查,從LauncherWrongEndState類分開:

public void addItem(Item item){ 


    // R - 0 O - 1 Y - 2 G - 3 B - 4 I - 5 V - 6 
      KeyQueue.add(item.getId()); 


      Iterator<Integer> kq = KeyQueue.iterator(); 

      if(KeyQueue.size() == 7){  
       while(kq.hasNext()){ 
        if(! (BaseQueue.poll() == KeyQueue.poll())) 
        { 

         State.setState(WrongEndState); 
         break; 
        } else 
         State.setState(RightEndState); 

       } 
      } 

這是一部分,或者檢查玩家想要做什麼WrondEndState(或重啓退出):

裏面的if-else這個類中的handler.getKeyManager().restart.restart是一個關鍵:

restart = keys[KeyEvent.VK_R];

,所以是.exithandler.getKeyManager().exit

exit = keys[KeyEvent.VK_Q];

public void tick(){ 

    if(handler.getKeyManager().restart) 
     try { 
      gameStart(); 

    } catch(Exception ioe){ 
      System.out.print("Error."); } 
    if(handler.getKeyManager().exit) 
     System.exit(0); 
} 

這是gameStart();方法的if-else代碼調用:

public void gameStart() throws Exception{ 
    Game game = new Game("DUNGEON ESCAPE", 500,500); 
    game.start(); 

    AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File("C:\\Users\\user\\Documents\\NetBeansProjects\\ThisMaze\\src\\OurMaze\\BGM.wav")); 
    Clip clip = AudioSystem.getClip(); 
    clip.open(inputStream); 
    clip.loop(Clip.LOOP_CONTINUOUSLY); 
    Thread.sleep(10000000); // looping as long as this thread is alive 

    } 
} 

請幫助,如果你需要更多的代碼,以幫助不知道。

+0

老實說,我認爲你在這裏添加了太多的代碼。閱讀你的問題,通過很多代碼來調試有點困難。你能否只包括啓動遊戲的代碼,檢查用戶是否已經在WrongEndState中結束,檢查用戶的輸入是Restart還是Qui,t以及開始新遊戲的位置? –

+0

請告訴您是否需要更多或更少的代碼。感謝鴿王先生。 – Wisteria

+0

'handler.getKeyManager()。restart'重新啓動一個方法或一個鍵?當遊戲結束時,你如何關閉它也很重要。 – nullpointer

回答

1

如果您希望重新啓動,請勿創建new Game。這是不必要的。

當遊戲開始時,一個新的遊戲實例被創建,這很好。開始調用,這很好。在一場比賽中,有幾件事情,狀態,對象是他們都具有初始狀態/價值的對象。

可以說你有一個遊戲,你所要做的就是向前跳,跳躍。有一個得分和時間花在當前運行,玩家有位置等。如果你死了,你希望它重新啓動。您不會通過new Game 創建其他遊戲,只需將所有內容恢復到其初始狀態/值。

這fictianal遊戲resetGame方法是這樣的:

private void resetGame(){ 
    player.x = 0; //assuming player starts at 0,0 
    player.y = 0; 
    score = 0; 
    time = 0; 
} 

查找你的遊戲的一切,應該是恢復在重新啓動其初始值。

這是非常簡單的,但我希望它是可以理解的。

+0

對不起,對於遲到的回覆。我想我已經找到並改變了每個變量。但是遊戲並沒有使用這些新變量。你可以舉一個例子,將變量,布爾值和數組更改爲另一個類的值_? – Wisteria

+0

@Wisteria如果沒有看到實際的代碼,你很難說出你應該做什麼,但你可以像訪問public.somePublicVariable = 0一樣訪問公共領域;或者通過getter和setter,比如game.setVariable(0);如果您需要更具體的答案,考慮詢問包含每個遊戲的其他問題是否應播放應重置的相關變量。 – eldo