2011-12-20 4 views
3

저는 스칼라에서 roguelike를 쓰고 있습니다. 나는 예를 들어 사용자가 화살표 키를 누를 때를 볼 수 있어야한다. 내가 찾은 모든 해결책은 플레이어가 엔터를 눌러야합니다.콘솔의 키 누름을 감지하는 방법은 무엇입니까?

C의 getch()와 비슷한 방식으로 콘솔 앱에서 키 누르기를 감지 할 수있는 방법이 있습니까?

답변

2

Scala에는 REPL에서 사용되기 때문에 (배포가 약간 수정 된) 배포본에 jline이 포함되어 있습니다. 일반적으로로드되지는 않지만 스칼라 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

스칼라는 JVM 상단에 위치하므로 스칼라에 대한 대답은 Java에 대한 대답과 완전히 동일합니다.

불행히도, 나는 당신이 그것을 좋아할 것이라고 생각하지 않습니다 - 자세한 내용은 this 다른 답변을 참조하십시오.

+0

은 단순히 키 누름을 기록하는 데 사용할 보이지 않는 창을 만들 수이 질문에 대한 답변에서

봐? – Gareth

+0

콘솔 앱으로 앱이 정말로 필요합니까? 당신이하려는 일은 GUI (Swing 또는 SWT - 당신이 선호하는 것)에서 훨씬 쉬울 것입니다. 나는 당신이 그 악의적 인 "느낌"을 정말로 원한다면 콘솔처럼 보이는 GUI를 만들 수있을 것이라고 확신한다. –

+0

나는 그것이 GUI 응용 프로그램 _could_ 같아요. 아이디어는 Telnet 또는 그와 비슷한 것을 통해 재생할 수 있다는 것이 었습니다. – Gareth

4

내가 모르는 뭔가가 있어야합니다.

+0

err, no, 그냥 InputStream, read()는 단일 바이트를 (int로) 읽습니다. 콘솔에서이 키를 읽으면 실제 하나의 화살표 키를 누를 것입니다. 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) 
}