Ergebnis 1 bis 4 von 4

Thema: Frage zu Tastatur Script in RPG Maker XP

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #3
    Zitat Zitat
    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:
    Code:
    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 findest du eine Liste mit den Befehlen der Win-API. Zum Abfragen des Tastaturzustandes kannst du z.B. die Funktion GetKeyboardState 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:
    Code:
    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
    Code:
    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:
    Code:
    DLL
    User32.dll
    Also schreibst du folgenden Rubycode:
    Code:
    getkeyboardstate = Win32API.new("GetKeyboardState", "user32", ["p"], "i")
    Aufrufen tust du die Funktion folgendermaßen:
    Code:
    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:
    Code:
    hatfunktioniert_als_boolean = hatfunktioniert == 0
    Auf die einzelnen Byte-Werte in deinem String kannst du mit bytearray[index] zugreifen (nur in Ruby 1.8!).

    Zitat Zitat
    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
    Code:
    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 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.

    Geändert von -KD- (08.04.2012 um 19:18 Uhr)

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •