Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu Tastatur Script in RPG Maker XP
Failcakes
08.04.2012, 17:32
Hallo! :3
Ich brauche Hilfe und zwar geht es mir um das Abfragen der gesammten Tastatur im RPG Maker XP. Ich weiß, dass es dafür schon ein Script gibt, aber ich würde doch gerne mal versuchen, das selbst zu scripten. (Einfach zu lernzwecken, und aus Ehrgeiz heraus! :D) Jetzt hab ich aber null Plan wie ich da anfangen soll. Kann man die Tasten direkt über RGSS abfragen, oder muss man dafür extra DLLs einbinden? Und sind diese DLLs dann in C geschrieben? So habe ich es auf einer anderen Seite gelesen, aber vllt stimmt das auch nicht und vllt geht es auch einfacher? :D
Ich weiß ihr werdet sagen, dass ich ja einfach das schon vorhandene Script runterladen kann, aber dann ist die Gefahr, dass ich alles nur abtippe irgendwie zu Groß...
Auf das Umsteigen kann man ja am Ende immer noch!
Wär voll nett wenn ihr helfen Könntet!
Danke im Vorraus! :)
Die Tastatur-Scripte benutzen keine DLL-Dateien. Lediglich die Windows API. Zumindest was ich bisher gesehen habe.
Aber sehr viel kann man dabei nicht "selbst" Scripten da es an sich nicht sonderlich viel ist.
Lediglich den Funktionsaufruf an die API senden und das Ergebnis abfragen. Das war es auch schon. Ist sehr einfach und langweilig, und ziemlich unspektakulär.
Was dabei vielleicht noch ein wenig aufwändiger werden könnte falls man wenig Erfahrung hat ist die Unterscheidung zwischen "press?", "release?" und "trigger?" Abfragen.
Die API selbst sagt dir nur ob die Taste in diesem Moment gedrückt wird oder nicht.
Ich könnte dir Code-Beispiele geben, aber leider nicht jetzt in diesem Moment, vielleicht aber später.
Kann man die Tasten direkt über RGSS abfragen, oder muss man dafür extra DLLs einbinden? Und sind diese DLLs dann in C geschrieben? Die RGSS erlaubt nur einige wenige Tasten. Das liegt daran, dass die RGSS auch Gamepads supported und daher nur so viele Tasten erlaubt, dass jede Taste auch über das Gamepad benutzt werden kann. Willst du alle Tasten abfragen, musst du über eine DLL gehen. Die können in C geschrieben sein, aber auch in jeder anderen Hochsprache die die Kompilierung zu DLLs erlaubt (z.B. Pascal/Delphi, C++, D, ...).
Der RPGMaker XP (mit seiner ziemlich veralteten Rubyversion) stellt leider nur eine Möglichkeit bereit, auf Funktionen von DLLs zuzugreifen: Die WinAPI. Deren Benutzung ist etwas hakelig. Prinzipiell solltest du dabei etwas Ahnung davon haben, was für Datentypen es in Hochsprachen gibt und wie sie binär abgespeichert werden.
Die Win32API Klasse wird folgendermaßen instanziert:
Win32API.new( dllname, procname, importArray, export )
Damit legst du sozusagen eine Beschreibung für die Funktion an, die du aufrufen willst.
dllname ist ein String der den Namen bzw. Pfad der DLL enthält. Da du (hoffentlich) nur auf DLLs zugreifen willst, die Windows selbst mitliefert und da diese DLLs alle im Windows-Verzeichnis liegen, reicht es, den Namen der DLL anzugeben.
procname ist der Name der Funktion, die du aufrufen willst (ebenfalls ein String). importArray ist ein Array, der die Parametertypen für die Funktion enthält. Die Typen werden als Strings angegeben. Es gibt folgende Typen:
i für Integer,
l für long,
p für pointer
v für void (also KEIN Parameter)
Außerdem gibt es noch n für number. Allerdings scheinen i, l und n alle dasselbe zu machen (wie gesagt, ziemlich hakelig die API). In den meisten Fällen musst du nur zwischen i und p unterscheiden.
export steht für den Rückgabewert der Funktion. Den Typ gibst du wieder als String an.
Danach kannst du mit der call Methode die Funktion aufrufen, wobei du ihr als Parameter die Parameter der DLL-Funktion übergibst. i, l und n übergibst du als Integer Werte. p übergibst du als String. Strings sind in Ruby 1.8 ja nur Arrays von Bytes. Du kannst einen String mit 10 Zeichen also auch auffassen als Speicherblock aus 10 Bytes.
Hier (http://msdn.microsoft.com/en-us/library/Aa383749) findest du eine Liste mit den Befehlen der Win-API. Zum Abfragen des Tastaturzustandes kannst du z.B. die Funktion GetKeyboardState (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646299%28v=vs.85%29.aspx) verwenden. Ansonsten suchst du einfach nach der Funktion die du brauchst.
In der Beschreibung von GetKeyboardState steht was für Parameter und Rückgabewerte die Funktion hat.
Parameter ist:
lpKeyState [out]
Type: PBYTE
The 256-byte array that receives the status data for each virtual key
PBYTE steht für einen Pointer auf ein Bytearray. Also in Ruby der Typ "p" repräsentiert als String. In der Beschreibung steht, dass das Feld 256 Bytes enthalten soll. Also legst du einen String mit 256 Zeichen an.
Rückgabewert ist
Type: BOOL
Also ein Boolean, dargestellt als Integer mit 0=false und ansonsten true. Gibt an ob Aufruf funktioniert hat.
Ganz unten steht noch in welcher DLL die Funktion liegt:
DLL
User32.dll
Also schreibst du folgenden Rubycode:
getkeyboardstate = Win32API.new("GetKeyboardState", "user32", ["p"], "i")
Aufrufen tust du die Funktion folgendermaßen:
bytearray = "\000" * 256
hatfunktionioert = getkeyboardstate.call(bytearray)
\000 ist das nullte Zeichen. Da die API Beschreibung aber nicht sagt das der Bytearray nur 0en enthalten darf, kannst du auch jedes andere Zeichen verwenden.
Zum Schluss noch eine kleine Konvertierung:
hatfunktioniert_als_boolean = hatfunktioniert == 0
Auf die einzelnen Byte-Werte in deinem String kannst du mit bytearray[index] zugreifen (nur in Ruby 1.8!).
When the function returns, each member of the array pointed to by the lpKeyState parameter contains status data for a virtual key. If the high-order bit is 1, the key is down; otherwise, it is up.
Also kannst du abfragen ob eine Taste gedrückt wurde, in dem du
msb = 1<<7
bytearray[index] & msb == msb
msb ist der most-significant bit, oder auch high-order bit genannt. index ist der Code für die Taste, die du abfragst.
Das jetzt mal als Beispiel. Hier (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646267%28v=vs.85%29.aspx) wird der Mechanismus erklärt, wie in Windows die ganzen Tastenabfragen funktionieren. Am besten liest du dich auch dort mal ein. Evtl. ist GetKeyboardState auch nicht die beste Möglichkeit um Tasten abzufragen (in den Kommentaren unten steht, dass die Funktion buggy sein soll oO Naja, Windows halt). Lies dich also auch mal in die Alternativen GetKeyState und GetAsyncKeyState ein.
Failcakes
08.04.2012, 20:51
Danke für die Antworten! Vorallem danke an dich, -KD-, deine Hilfe war echt sehr ausführlich und genau die Art von Einstiegshilfe, nach der ich gefragt hab. :) Dieser Link zu den API-Befehlen ist auch echt spitze, nach sowas hab ich nämlich auch die ganze Zeit gesucht.
Also nochmal vielen Dank für die ganze Mühe!! <3 Hoffentlich bekomm ich das auf die Reihe. ^^
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.