2014-05-04 66 views
-2

我目前正在用Java製作一個簡單的2D RPG遊戲。Scanner(System.in).nextLine()阻止我的遊戲

我得到了渲染&滴答方法完成,遊戲工作正常。

現在我想實現一個控制檯,用戶可以輸入一些命令並與地圖交互。

問題是,當我開始遊戲,它只是凍結。該凍結是由Scanner(System.in).nextLine()引起的。這是我的分析器類:

import java.util.Scanner; 


public class Parser 
{ 
private CommandWords aValidCommands; 
private Scanner  aReader; 


public Parser() 
{ 
    this.aValidCommands = new CommandWords(); 
    this.aReader  = new Scanner(System.in); 
} // Parser() 


public Command getCommand() 
{ 
    String vInputLine; 
    String vWord1 = null; 
    String vWord2 = null; 

    System.out.print("> "); 



    vInputLine = this.aReader.nextLine(); 


    Scanner vTokenizer = new Scanner(vInputLine); 
    if (vTokenizer.hasNext()) { 
     vWord1 = vTokenizer.next();  
     if (vTokenizer.hasNext()) { 
      vWord2 = vTokenizer.next(); 

     } 
    } 

    if (this.aValidCommands.isCommand(vWord1)) { 

     return new Command(vWord1, vWord2); 
    } 
    else { 
     return new Command(null, null); 
    } 
} // getCommand() 
} // Parser 

和我的蜱功能(被稱爲60次/秒)

Parser aParser = new Parser(); 
Command command = aParser.getCommand(); 

當它到達行「vInputLine = this.aReader.nextLine(遊戲只是凍結);「。我不知道爲什麼。

此外解析器類工作正常,我已經使用這個類做了一個基於控制檯的RPG。我只是不知道爲什麼當我嘗試在我的2D遊戲中實現它時會凍結。

任何幫助,將不勝感激。

+5

它應該阻止。直到您在控制檯上輸入內容。你期望它做什麼? –

+2

你應該使用線程.. – perencia

回答

2

Scanner.nextLine()是一個阻塞呼叫。這意味着它將使當前線程等待,直到它返回一個值。如果你想通過你的掃描儀接收輸入,並且可能同時做其他事情,你需要另一個線程。

class Test { 

    private static Scanner scanner; 
    private static Thread inputThread = new Thread() { 
     public void run() { 
      scanner = new Scanner(System.in); 

      while(true) { 
        //scanner.nextLine(); 
      } 
     } 
    }; 

    public static void main(String[] args) { 
      inputThread.start(); 

      //handle everything else on main thread 
    } 
} 

因爲掃描儀正在接收一個線程輸入,並可能在操控性上其他THR輸入,你應該開始從線程0(新線)將值傳遞給主線程的思維方式(其調用主要方法)。

有很多方法可以做到這一點,最基本的可能是在輸入數據添加到列表的權利,當它進來,然後從你的其他線程列表中檢索它。但請記住,使用多線程時,您需要解決內存不一致的問題。如果兩個對象試圖訪問同一個對象(在這種情況下,包含數據的列表),則事情可能無法按預期進行計算。這是同步進來的地方:http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

+0

我明白我必須使用線程,但是當我的意思是凍結時,我並不意味着一個簡單的停頓,這是可以理解的,我的意思是凍結。我甚至無法在控制檯中輸入任何內容。 – user3601853

+0

@ user3601853所以當你的程序到達那一行時,它不會允許你輸入控制檯?或者當你輸入什麼時,什麼都沒有發生? –

+0

它不允許我輸入任何內容。只有我放在控制檯中的歡迎消息,然後什麼都沒有。無法輸入任何內容,無法在遊戲中移動。當代碼到達該行時,遊戲就會凍結。 – user3601853

相關問題