2011-12-20 24 views
3

私はScalaにroguelikeを書いています。ユーザーが例えば矢印キーを押したときを見ることができる必要があります。私が見つけたすべての解決策は、プレーヤーがエンターを押す必要があります。コンソールのキー押下を検出する方法は?

Cでgetch()と同様の方法でコンソールアプリでキー押下を検出する方法はありますか?

答えて

2

Scalaには、REPLで使用されているため、そのパッケージにはjlineが含まれています(パッケージは若干変更されています)。通常はロードされませんが、Scalaのlibディレクトリがどこにあるか分かっている場合は、クラスパスに追加することができます。あなたがクラスパスに追加する場合、これは動作します:

object Key extends App { 
    val con = new tools.jline.console.ConsoleReader() 
    println(con.readVirtualKey()) 
} 

は(このメソッドは、標準のマッチング、それぞれ、左ダウン、アップのために^ P^N^B^Fを与え、そして右になることに注意してくださいコントロールキー)。しかし、これはまたSystem.in.read()の標準的な振る舞いをオーバーライドするので、長さ1の配列を渡して、次の待ち行列を得ることができます(矢印キーの場合は1より大きいSystem.in.availableで待ち行列のテストを行います)。私にとって

System.in.read 

作品:

1

ScalaはJVMの上にあるため、Scalaの答えはJavaの答えとまったく同じです。

残念ながら、私はあなたがそれを好きになるとは思わない - 詳細については、this他の回答を参照してください。

+0

が、私は単純にキー入力を記録すると不可視のウィンドウを作成することができ、この質問への回答で

ルック? – Gareth

+0

本当にあなたのアプリはコンソールアプリケーションである必要がありますか?あなたがやろうとしていることは、GUI(SwingまたはSWT - 好きな方)の方がはるかに簡単です。私はあなたが本当にその悪者の "気分"を望むなら、コンソールのように見える* GUIを作成できると確信していますか? –

+0

私はそれがGUIアプリケーションであると思います。その考えは、それがTelnetやそれに類するものの上で遊ぶことができるということでした。 – Gareth

4

私は何かが欠けている必要があります。

+0

err、いいえ、その単なるInputStream、read()は1バイトを(intとして)読み込みます。コンソールで試してみると、実際には1つの矢印キーが押されていることがわかります。 scala> System.in.read res0:Int = 27 –

5

Enterの問題は、ターミナルバッファが入力されているため、rawモードにする必要があります。プラットフォーム固有の問題であることに注意してください。 UNIXシステム用のHow to read a single char from the console in Java (as the user types it)?

短い答え:

import sys.process._ 
(Seq("sh", "-c", "stty -icanon min 1 < /dev/tty") !) 
(Seq("sh", "-c", "stty -echo < /dev/tty") !) 

(1 to 20).foreach { _ => 
    val c = Console.in.read 
    println("Got " + c) 
} 
関連する問題