2015-04-23 118 views
2

我已成功地暂停使用*running = !running实现暂停/恢复功能

游戏,但它无法如果这是用来

而且thread.resume()thread.wait()无法正常工作或何时取消暂停取消暂停'P'被按下

private volatile boolean running; 
private Thread thread; 

public static enum STATE { 
    MENU, 
    GAME, 
}; 

public static STATE State = STATE.MENU; 

public void init(){ 
    requestFocus(); 
} 

private synchronized void start(){ 
    if(running) 
     return; 

    running = true; 
    thread = new Thread(this); 
    thread.start(); 
} 

private synchronized void stop(){ 
    if(!running) 
     return; 

    running = false; 
    try{ 
     thread.join(); 
    }catch(InterruptedException e){ 
     e.printStackTrace(); 
    } 
} 

public void run() { 
    init(); 

    while(running){ 
     /some codes 
    } 
    stop(); 
} 

private void render(){ 

    if(State == STATE.GAME){ 
     p.render(g); 
     c.render(g); 

    }else if(State == STATE.MENU){ 
     menu.render(g); 
    } 

    g.dispose(); 
    bs.show(); 
} 

public void keyPressed(KeyEvent e){ 
    int key = e.getKeyCode(); 

    if(State == STATE.GAME){ 
    if(key == KeyEvent.VK_RIGHT){ 
     p.setVelX(5); 
    }else if(key == KeyEvent.VK_LEFT){ 
     p.setVelX(-5); 
    }else if(key == KeyEvent.VK_DOWN){ 
     p.setVelY(5); 
    }else if(key == KeyEvent.VK_UP){ 
     p.setVelY(-5); 
    }else if(key == KeyEvent.VK_SPACE && !is_shooting){ 
     c.addEntity(new Bullet(p.getX(), p.getY(), tex, this)); 
     is_shooting = true; 
    }else if(key == KeyEvent.VK_P){ 

此行是暂停。

 running = !running; 
    } 
    } 
} 

public void keyReleased(KeyEvent e){ 
    int key = e.getKeyCode(); 

    if(key == KeyEvent.VK_RIGHT){ 
     p.setVelX(0); 
    }else if(key == KeyEvent.VK_LEFT){ 
     p.setVelX(0); 
    }else if(key == KeyEvent.VK_DOWN){ 
     p.setVelY(0); 
    }else if(key == KeyEvent.VK_UP){ 
     p.setVelY(0); 
    }else if(key == KeyEvent.VK_SPACE){ 
     is_shooting = false; 
    }else if(key == KeyEvent.VK_P){ 


// This line doesn't work. 

     running = true; 
    } 
} 
+0

你已经打破了循环,运行设置为true不会重新启动它。 – Renatols

回答

1

目前,只要running设置为false,你的游戏线程退出(run()方法返回)。

public void run() { 
    init(); 
    while(running){ 
     /some codes 
    } 
    stop(); 
} 

应改为更多的东西是这样的:

public void run() { 
    init(); 
    while(true){ 
     if(!running) { 
      Thread.sleep(1000); //1 second or something else 
      continue; 
     } 
     //Game logic here 
    } 
    stop(); 
} 

你当然需要在运行区分和顿了一下,才能够打破这个循环。

0

设置运行=!捉迷藏将只是改变了变数,你实际上并没有,除非你使用在游戏中循环的变量停止任何东西。

要暂停的方法,用Thread.sleep()或者干脆停止线程,然后再次启动它,如果你不知道要多久才能暂停了。