2011-05-29 48 views
2

我有幾個問題,我很難找到有關如何解決的好信息。首先,我有一個遊戲結束屏幕,它會在什麼時候顯示。我試圖使用將Threads運行設置爲false,以便它停止運行,然後當觸摸屏幕將其設置爲true時,但它不會使屏幕重新運行。此外,我將需要能夠實際清除所有時間,以便重置它(這是一個很好的方法)。這同樣我需要我假設爲暫停和簡歷。如果運行未設置爲false,則即使sleep()以較慢的增量顯示也會繼續運行。這是我的線索,看看你是否注意到我能做些什麼。遊戲結束和暫停/繼續照顧線程

public class GameLoopThread extends Thread { 
    private GameView view; 
    public static boolean running = false; 
    static final long FPS = 10; 


    public GameLoopThread(GameView view) { 
     this.view = view; 
    } 

    public void setRunning(boolean run) { 
     running = run; 
    } 

    @Override 
    public void run() { 
     long ticksPS = 1000/FPS; 
     long startTime; 
     long sleepTime; 
     while (running) { 
       Canvas c = null; 
       startTime = System.currentTimeMillis(); 
       try { 
         c = view.getHolder().lockCanvas(); 
         synchronized (view.getHolder()) { 
           view.onDraw(c); 
         } 
       } finally { 
         if (c != null) { 
           view.getHolder().unlockCanvasAndPost(c); 
         } 
       } 
       sleepTime = ticksPS-(System.currentTimeMillis() - startTime); 
       try { 
         if (sleepTime > 0) 
           sleep(sleepTime); 
         else 
           sleep(10); 
       } catch (Exception e) {} 
     } 
    } 

}

現在,這部分導致了暫停/繼續一個大問題。我有一個handler.postDelayed處理我的精靈的產卵。基本上,當屏幕顯示暫停(因爲它看起來像是如果我使用睡眠),問題是處理程序(它在GameView中)看起來像時間仍在運行。有沒有辦法將它重置爲零...最好在兩個類的遊戲結束,並暫停處理程序,以及在暫停期間?謝謝

編輯:截至目前我正試圖使用​​選項菜單,使其重新開放運行遊戲的活動,使新遊戲。它似乎重置它,但它凍結了過程中。任何人都知道我可以解決這個問題?

@Override 
public boolean onCreateOptionsMenu(Menu menu){ 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()){ 
    case R.id.newgame: 
     GameView.gameState=0; 
     GameLoopThread.running=true; 
     Intent game = new Intent(PlayGame.this, PlayGame.class); 
     startActivity(game); 
    break; 
    case R.id.pause:  Toast.makeText(this, "You pressed Pause", Toast.LENGTH_LONG).show(); 
    break; 
    case R.id.quit: Toast.makeText(this, "You pressed Quit", Toast.LENGTH_LONG).show(); 
    break; 
    } 
    return true; 
} 

那是我的選項菜單。

回答

0

這看起來可能不像你正在尋找的anwser,但如果你想創建易於擴展的代碼(並學習一種新的設計模式!),那麼這就是要走的路。

大多數遊戲使用狀態機來處理這些事情。

例如

interface GameState{ 
    public void render(long elapsedTime); 

} 

現在你可以創建不同的狀態,就像一個MenuState,遊戲狀態,PauseState,OptionState,GameOverState等

一些僞代碼來獲取整個想法:

State currentState = null; 

public void run(){ 
    while(true){ 
     // Do your loop here 
     currentState.render(time); 
    } 
} 

public void setState(State state){ 
    currentState = state; 
} 

狀態示例:

public class MenuState implements GameState{ 
    public void render(long elapsedTime){ 
     //Render menu here 
    } 
} 

或者

public class GameState implements GameState{ 
    public void render(long elapsedTime){ 
     //Render gameplay here 
    } 
} 

currentState指向當前狀態,並決定哪些人會渲染/更新。只要改變它的參考,你的暫停菜單就會被繪製。

這是一個非常常見的遊戲設計模式,四處搜索!

祝你好運!