私はScalaにroguelikeを書いています。ユーザーが例えば矢印キーを押したときを見ることができる必要があります。私が見つけたすべての解決策は、プレーヤーがエンターを押す必要があります。コンソールのキー押下を検出する方法は?
Cでgetch()と同様の方法でコンソールアプリでキー押下を検出する方法はありますか?
私はScalaにroguelikeを書いています。ユーザーが例えば矢印キーを押したときを見ることができる必要があります。私が見つけたすべての解決策は、プレーヤーがエンターを押す必要があります。コンソールのキー押下を検出する方法は?
Cでgetch()と同様の方法でコンソールアプリでキー押下を検出する方法はありますか?
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
作品:
ScalaはJVMの上にあるため、Scalaの答えはJavaの答えとまったく同じです。
残念ながら、私はあなたがそれを好きになるとは思わない - 詳細については、this他の回答を参照してください。
私は何かが欠けている必要があります。
err、いいえ、その単なるInputStream、read()は1バイトを(intとして)読み込みます。コンソールで試してみると、実際には1つの矢印キーが押されていることがわかります。 scala> System.in.read res0:Int = 27 –
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)
}
が、私は単純にキー入力を記録すると不可視のウィンドウを作成することができ、この質問への回答で
ルック? – Gareth
本当にあなたのアプリはコンソールアプリケーションである必要がありますか?あなたがやろうとしていることは、GUI(SwingまたはSWT - 好きな方)の方がはるかに簡単です。私はあなたが本当にその悪者の "気分"を望むなら、コンソールのように見える* GUIを作成できると確信していますか? –
私はそれがGUIアプリケーションであると思います。その考えは、それがTelnetやそれに類するものの上で遊ぶことができるということでした。 – Gareth