【问题标题】:Game Over and Pause/Resume taking care of the thread游戏结束和暂停/恢复处理线程
【发布时间】:2011-05-29 06:41:10
【问题描述】:

我遇到了一些问题,我很难找到有关如何解决的好信息。首先,我有一个游戏结束屏幕,它会在它应该出现的时候出现。我尝试使用将运行的线程设置为 false 以使其停止运行,然后在触摸屏幕时将其设置回 true,但它不会使屏幕恢复运行。此外,我将需要能够真正清除所有时间,以便它重置它(什么是这样做的好方法)。这同样我需要我假设暂停和恢复。如果 running 未设置为 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;
 }

这是我的选项菜单。

【问题讨论】:

    标签: java android


    【解决方案1】:

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

    大多数游戏都使用状态机来处理这类事情。

    例如

    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 指向当前状态并决定渲染/更新哪个状态。只需更改它的引用,您的暂停菜单就会被绘制出来。

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      相关资源
      最近更新 更多