我目前正在用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游戏中实现它时,我只是不知道为什么会冻结。
任何帮助都将不胜感激。
答案 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);)
只是打印并且没有完成该行。