Ergebnis 1 bis 6 von 6

Thema: RMVX - Playerinteraktionen Blockieren

  1. #1

    RMVX - Playerinteraktionen Blockieren

    Hi Leute,

    ich hab mich jetzt seit lägerer zeit endlich mal wieder ein wenig mit dem "makern" beschäftigt und schaue mir auch gerade die Ruby-Scriptsprache an.

    Zu meinem Problem:
    Ich möchte gerne Tastatureingaben über die windows api funktion abfragen und jenachdem dann auch Aktionen im Game ausführen. Das funktioniert soweit schon ganz gut. Ich möchte aber temporär (z.B. beim drücken einer Taste) alle Standart-Eingabemöglichkeiten blockieren, also sowohl das Manü, als auch die Spielerbewegungnen usw. Habt ihr ne Idee, wo ich da am besten ansetzen kann?

    Viele Grüße,
    Towky

  2. #2
    RGSS verwendet ein eigenes Input-Modul welches die Tastenabfrage übernimmt und in jeglichen Standardscripten verwendet wird.
    Auf dem Modul muss regelmäßig die Update-Methode aufgerufen werden damit neue Eingaben getätigt werden können.
    Diese Update-Methode wird durch die derzeit bestehende Instanz der Variable $scene aufgerufen.
    In der Update-Methode der verschiedenen Szenen sollte irgendwo der Aufruf für das Update von Input liegen.

    Du könntest eine globale Variable als Schloss benutzen damit dieses Update des Input-Moduls herausgefiltert wird. Dann müsstest du lediglich in jeder Szene welche das Update aufruft eine Abfrage zum Zustand dieser Schlossvariablen machen.

  3. #3
    Ist die Blocker-Taste über die API abgefragt?
    Wenn ja funktioniert Cornix' Ansatz, ansonsten wird halt auch eben diese Abbruchbedingung blockiert

    Falls dem so ist:
    Der Ansatz wäre dann in allen relevanten Scene-updates zu branchen, ob die "Blockier"-Variable sitzt, und dann wenn ja nur die abbruchbedingung überprüfen und sämtliche anderen Änderungen beizubehalten (Logik, Graphic, Audio) [also im Grunde copy&paste der normalen update funktion mit rauseditieren der Input-Abfragen und hinzufügen genau einer neuen), und wenn nein: die alte Funktion plus abfragen der block-taste.

  4. #4
    Erstmal danke für die Antworten, ich habe gestern kurz drüber geschaut und der Ansatz sollte funktionieren.

    @Todu: Ja, die Abfragen der von mir genutzten Keys mache ich über die Api.

    Das Problem was ich mit dieser Lösung hab, ist, das ich das Script, wenn es denn mal fertig ist, auch nur als Script veröffentlichen möchte und nicht für ein Game brauche. Demnach möchte ich den Leuten, die dieses Script benutzen möchten, es so einfach wie möglich machen: im Idealfall nur eben reinkopieren, objekt aufrufen, fertig. Also nicht noch großartig in den (Ich nenn sie mal) "Core"-Klassen rumfuchteln.

    Also eine schönere Lösung währe, wenn man mit Hilfe der Api oder so den Input Blokieren könnte, aber dazu kenne ich mich mit diesen ganzen kram kaum aus.
    (Komme aus der Webentwickler-Ecke )

  5. #5
    Du könntest das Input-Modul direkt blockieren.
    Code:
    class << Input
      attr_acessor :blocked
      [:trigger?, :press?, :repeat?].each do |methode|
        # benenne die ursprüngliche Methode um
        new_name = :"#{methode}_unblocked"
        alias_method new_name, methode
        # definiere neue Methode mit altem Namen, die blocked abfragt
        define_method(methode) {|key|
          if blocked then false else send(new_name, key) end
        }
      end
      [:dir4, :dir8].each do |methode|
        new_name = :"#{methode}_unblocked"
        alias_method new_name, methode
        define_method(methode) {
          if blocked then 0 else send(new_name) end
        }
      end
    end
    Der Code ist ungetestet, aber theoretisch müsstest du damit per
    Code:
    Input.blocked = true
    alle Standardeingaben blockieren können.

  6. #6
    Ahh coole Sache, danke, probier ich nachher direkt aus.

    Off-Topic:
    Es ist also möglich auch vorher definierte Klassen zu überschreiben?!
    Wird dann die gesamte Klasse überschrieben oder gibt es auch die Möglichkeit nur gewisse Funktionen der klassen zu überschreiben?

    EDIT: Ok, hat sich erledigt, ich hab mir den Ruby/RGSS-Kurs von -KD- mal vorgenommen, da steht alles schön erklärt Danke nochmal.

    EDIT EDIT: Super, hat funktioniert, ich musste nur nach dem Input.blocked = true noch ein Input.update aufufen

    Geändert von Towky (28.07.2012 um 10:46 Uhr)

Berechtigungen

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