Game Over和Pause / Resume处理线程

时间:2011-05-29 06:41:10

标签: java android

我有一些问题我很难找到有关如何修复的好信息。首先,我有一个游戏结束屏幕,显示它应该什么时候。我试图使用设置线程运行为假,因此它停止运行,然后触摸屏幕将其设置为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中)似乎时间仍然在运行。有没有办法将其重置为零...最好在Game Over的两个类上,并在暂停期间暂停处理程序?感谢

编辑:截至目前,我正在尝试使用选项菜单通过重新打开运行游戏的活动来制作新游戏。它似乎重置它,但它在此过程中冻结它。有谁知道如何解决这个问题?

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

这是我的选项菜单。

1 个答案:

答案 0 :(得分:0)

这可能看起来不像你正在寻找的那个,但如果你想创建易于扩展的代码(并学习一个新的设计模式!),那么这就是你要走的路。

大多数游戏都使用状态机进行此类操作。

例如

interface GameState{
    public void render(long elapsedTime);

}

现在您可以创建不同的状态,如MenuState,GameState,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指向当前状态并决定哪一个呈现/更新。只需更改它的参考,即可绘制暂停菜单。

这是游戏中非常常见的设计模式,搜索一下!

祝你好运!