2015-04-23 116 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()或者乾脆停止線程,然後再次啓動它,如果你不知道要多久才能暫停了。