扫描仪(System.in).nextLine()阻止我的游戏

时间:2014-05-04 17:21:51

标签: java parsing

我目前正在用Java制作一个简单的2D RPG游戏。

我得到了渲染&滴答方法完成后,游戏运行正常。

现在我想实现一个控制台,用户可以在其中键入一些命令并与地图进行交互。

问题是当我开始游戏时,它只是冻结。冻结是由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(); &#34 ;.我不明白为什么。

此外,解析器类工作正常,我已经使用此类创建了基于控制台的RPG。当我尝试在我的2D游戏中实现它时,我只是不知道为什么会冻结。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分: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输入,你应该开始考虑将值从thread-0(新线程)传递到主线程(调用main方法)的方法)。

有很多方法可以做到这一点,最基本的可能是将输入数据添加到列表中,然后从其他线程的列表中进行检索。但请记住,在使用多个线程时,您需要担心内存不一致。如果两个对象都试图访问同一个对象(在这种情况下,包含数据的列表),事情可能无法按预期计算。这是同步的来源:http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

答案 1 :(得分:0)

之所以会这样,是因为它实际上没有完成该行。

例如:

代码:

  Scanner scan = new Scanner(System.in);        
  int a, b;        
  String name;
        
  System.out.println("Enter two numbers");
        
  a = scan.nextInt();
  b = scan.nextInt();        
        
  System.out.println("Sum of " +a+ " and " +b+ " is " +(a+b));
  System.out.println("Please enter your name");        
  name = scan.nextLine();
  System.out.println(""+name);

输出:

Enter two numbers
1
2
Sum of 1 and 2 is 3
Please enter your name -> And it freezes here.

发生这种情况是因为 nextLine 仍在等待,因为此代码 (System.out.println(""+name);) 只是打印并且没有完成该行。