Ich hab das Script mal ausprobiert und bei mir funktioniert es hinten und vorne nicht (trigger? funktioniert als einziges, die anderen Sachen wie repeat? und press? spinnen allerdings rum). Allerdings habe ich es auf Ubuntu per Wine gestartet, von daher kann es sich dort auch etwas anders verhalten als unter richtigem Windows.
Nichtsdestotrotz macht das Script einfach keinen Sinn. Es werden die falschen Sachen abgefragt, LSB und MSB verwechselt usw.
Ich habe das Script mal korrigiert. Hier der aktualisierte Code:
Code:
class String
unless method_defined? :ord
def ord
self[0]
end
end
end
module Keys
MEMORY_SIZE = 16
REPEAT_TIME = 4
MSB = 128
LSB = 1
@counter = 0
@key_stores = Array.new(MEMORY_SIZE) {0.chr * 256}
@dll_func = Win32API.new("user32", "GetKeyboardState", %W(p), "i")
class << self
def update
@counter = (@counter+1) % MEMORY_SIZE
@dll_func.call(current_store)
end
def current_store
@key_stores[@counter]
end
def previous_store(n=1)
@key_stores[(@counter - n) % MEMORY_SIZE]
end
def press? key, store=current_store
store[key] & MSB == MSB
end
def trigger? key
press?(key) && !press?(key, previous_store)
end
def release? key
!press?(key) && press?(key, previous_store)
end
def repeat? key
trigger?(key) || (0...MEMORY_SIZE).all? {|n| press?(key, previous_store(n)) } &&
@counter % REPEAT_TIME == 0
end
def toggle? key
current_store[key] & LSB == LSB
end
# Methoden capital?, scroll?, numlock?, insert? usw. für alle TOGGLE-Tasten
# werden ebenfalls definiert
%W(CAPITAL HANGUL JUNJA FINAL HANJA KANJI MODECHANGE
INSERT NUMLOCK SCROLL).each do |togglekey|
konst = Keys.const_get(togglekey)
define_method(:"#{togglekey.downcase}?") do
toggle? konst
end
end
alias capslock? capital?
# gibt den gerade gedrückten Buchstaben aus
def get_letter
char = ("A".."Z").find {|letter|
repeat? letter.ord
}
write_big = press?(SHIFT)
write_big = !write_big if capslock?
char ? (write_big ? char : char.downcase) : nil
end
end
end
Die ganzen Konstanten für die Tasten kannst du behalten. Das Script kann auch einfach unter das bestehende geschrieben werden, es ersetzt ja die Methoden. Ich habe auch eine Methode get_letter hinzugefügt, welche den eingegebenen Buchstaben zurückgibt (und dabei die Groß/Klein-Schreibung durch die Capslock und Shift-Taste beachtet). Ich würde dir dennoch raten das Script nochmal ausgiebig zu testen. Ich verwende z.B., anders als in den anderen Inputskripten, kein GetAsyncKeyState, weil ich bislang nie so ganz verstanden habe wozu das gut sein soll. Theoretisch könnte es passieren, dass wenn das Spiel laggt und man extrem schnell auf die Tasten haut, diese nicht erkannt werden. Aber ich hab das nie reproduzieren können. k.a. ob es irgendwelche Nachteile hat, nur GetKeyboardState und kein GetAsyncKeyState zu verwenden.