2014-11-29 9 views
7

Mam app rEPL w Go, który powinien reagować na klawiaturze wydarzeń prasowych (wyraźne działanie na każdy klawisz wciśnięty klawisz), ale ReadString oczekuje na klawisza return być wciśnięty przed przeczytaniem os.Stdin:Jak reagować na zdarzenia keypress w Go?

import (
    "bufio" 
    "os" 
) 

for { 
    reader := bufio.NewReader(os.Stdin) 
    key, _ := reader.ReadString('\n') 
    deferKey(key) 
} 

Jak mogę zareagować na kluczowe wydarzenia prasowe w Go?

+2

możliwy duplikat [funkcji Golanga podobnej do getchar] (http://stackoverflow.com/questions/14094190/golang-function-similar-to-getchar) – LinearZoetrope

+0

, więc potrzebuję użyć ncurses? Nie ma sposobu, aby to zrobić z wbudowanymi pakietami? – marcio

+1

https://github.com/zetamatta/nyagos lub https://github.com/rocky/go-fish/blob/d44fd886cb8de9df818211c5692814deeadb0651/repl.go może dać ci wskazówki, ale nie jestem pewien, czy istnieje skrzyżowanie sposób platformy. – VonC

Odpowiedz

3

Silniki do gier powszechnie stosują tego rodzaju funkcje. Zwykle są również agnostyczne (zazwyczaj przynajmniej Windows, Linux, Mac OS X). Spróbuj na przykład Azul3D's keyboard library.

Logika jest poza czubek głowy coś takiego

watcher := keyboard.NewWatcher() 
// Query for the map containing information about all keys 
status := watcher.States() 
left := status[keyboard.ArrowLeft] 
if left == keyboard.Down { 
    // The arrow to left is being held down 
    // Do something! 
} 

uzyskiwania listy jakie klucze są aktualnie wciśnięty jest kwestią iteracji mapę poprzez wystawianie klucze gdzie wartość spadła.

+0

Skończyło się na użyciu ncurses. Ale spróbuję tego, ponieważ tak naprawdę nie potrzebuję całego przyduszenia z biblioteki przekleństw. – marcio

+2

tak, ale kto zapełnia tę mapę, coś musi ustawić stany, ta biblioteka nie będzie działała na to, czego potrzebujesz. – leonarth

+0

Niestety nie działa na Linuksie. – Matt

Powiązane problemy