2014-05-04 39 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

相关问题