Computerwissenschaften

Maus- und Tastatureingabe in Gosu

Spiele sind per Definition interaktiv. Gosu macht diese Interaktion mit einer einfachen Oberfläche zum Erkennen und Reagieren auf Drücken von Tasten und Maustasten unkompliziert.

Es gibt zwei Hauptmethoden, um Eingaben in Ihr Programm zu verarbeiten. Der erste ist ein ereignisorientierter Ansatz. Wenn Tasten gedrückt werden, erhalten Ihre Programme ein Ereignis und Sie können entsprechend reagieren. Die zweite besteht darin, zu überprüfen, ob zum Zeitpunkt eines Updates eine bestimmte Taste gedrückt wird. Beide Techniken sind absolut gültig. Verwenden Sie diejenige, die am besten zu Ihnen passt.

 

Schlüssel- und Tastenkonstanten

Hinter den Kulissen werden Schaltflächen durch Ganzzahlen dargestellt. Diese ganzzahligen Codes sind plattformabhängig und sollten wahrscheinlich nicht in Ihren Spielcode gelangen. Um dies zu abstrahieren, stellt Gosu eine Reihe von Konstanten zur Verfügung, die verwendet werden können.

Für jede Tastaturtaste gibt es eine Gosu :: Kb * -Konstante. Für die meisten Schlüssel sind die Namen dieser Konstanten leicht zu erraten. Die Pfeiltasten sind beispielsweise Gosu :: KbLeft , Gosu :: KbRight , Gosu :: KbUp und Gosu :: KbDown . Eine vollständige Liste finden Sie in der Dokumentation zum Gosu-Modul .

Es gibt auch ähnliche Konstanten für Maustasten. Sie verwenden hauptsächlich Gosu :: MsLeft und Gosu :: MsRight für Links- und Rechtsklick. Gamepads werden auch über die Gosu :: Gp * -Konstanten unterstützt.

Dieser Artikel ist Teil einer Reihe. Lesen Sie weitere Artikel über Rapid Game Prototyping in Ruby

 

Ereignisorientierte Eingabe

Eingabeereignisse werden an die Gosu :: Window- Instanz übermittelt . In der Hauptschleife liefert Gosu vor dem Aufruf des Updates Ereignisse für alle Tasten, die entweder gedrückt oder losgelassen wurden. Dazu werden die Methoden button_down und button_up aufgerufen und die ID der gedrückten Taste oder Taste übergeben.

In den Methoden button_down und button_up finden Sie häufig eine case- Anweisung. Dies ist nicht nur sehr funktional, sondern bietet auch eine sehr elegante und ausdrucksstarke Möglichkeit, zu entscheiden, was zu tun ist, je nachdem, welche Taste gedrückt oder losgelassen wurde. Das Folgende ist ein kurzes Beispiel dafür, wie eine button_down- Methode aussehen kann. Es sollte in Ihre Gosu :: Window- Unterklasse eingefügt werden und schließt das Fenster (Beenden des Programms), wenn die Escape- Taste gedrückt wird.


def button_down(id)
case id
when Gosu::KbEscape
close
end
end

Einfach richtig? Lassen Sie uns dies erweitern. Hier ist eine Spielerklasse . Es kann sich nach links und rechts bewegen, wenn die linke und rechte Taste gedrückt werden. Beachten Sie, dass diese Klasse auch die Methoden button_down und button_up hat . Sie funktionieren genau wie die Methoden einer Gosu :: Window- Unterklasse. Gosu weiß nichts über Player , wir rufen die Methoden des Players manuell über die Methoden von Gosu :: Window auf . Ein vollständiges, ausführbares Beispiel finden Sie hier .


class Player
# In pixels/second
SPEED=200
def self.load(window)
with_data('player.png') do|f|
@@image=Gosu::Image.new(window, f, false)
end
end
def initialize(window)
@window=window
@x=(@window.width / 2) - (@@image.width / 2)
@[email protected] - @@image.height
@direction=0
end
def update(delta)
@x += @direction * SPEED * delta
@x=0 if @x @window.width - @@image.width
@[email protected] - @@image.width
end
end
def draw
@@image.draw(@x, @y, Z::Player)
end
def button_down(id)
case id
when Gosu::KbLeft
@direction -= 1
when Gosu::KbRight
@direction += 1
end
end
def button_up(id)
case id
when Gosu::KbLeft
@direction += 1
when Gosu::KbRight
@direction -= 1
end
end
end

Dieser Artikel ist Teil einer Reihe. Lesen Sie weitere Artikel über Rapid Game Prototyping in Ruby

 

Eingabe abfragen

Wenn die ereignisbasierte Eingabe nicht Ihrem Stil entspricht, können Sie jederzeit ein beliebiges Gosu :: Window abfragen, um festzustellen , ob eine Taste oder Taste gedrückt wurde. Sie können die Rückrufe button_down und button_up vollständig ignorieren .

Um das Gosu :: -Fenster abzufragen , um festzustellen, ob eine Taste gedrückt wurde, rufen Sie button_down? Methode mit der ID der Schaltfläche, die Sie überprüfen möchten. Vergessen Sie nicht das Fragezeichen in diesem Aufruf! Wenn Sie button_down (Gosu :: KbLeft) aufrufen , melden Sie einen Tastendruck an die Gosu :: Window- Unterklasse. Auch wenn Sie keine Rückrufmethoden definiert haben, wird die übergeordnete Klasse Gosu :: Window . Es wird kein Fehler auftreten, es funktioniert einfach nicht wie erwartet. Vergiss das Fragezeichen einfach nicht!

Hier ist die Player- Klasse neu geschrieben, um button_down zu verwenden ? anstelle von Ereignissen. Ein vollständiges, ausführbares Beispiel finden Sie hier. Dieses Mal wird die Eingabe zu Beginn der Aktualisierungsmethode überprüft . Sie werden auch feststellen, dass dieses Beispiel kürzer, aber meiner Meinung nach weniger elegant ist.


class Player
attr_reader :x, :y
# In pixels/second
SPEED=200
def self.load(window)
with_data('player.png') do|f|
@@image=Gosu::Image.new(window, f, false)
end
end
def initialize(window)
@window=window
@x=(@window.width / 2) - (@@image.width / 2)
@[email protected] - @@image.height
@direction=0
end
def update(delta)
@direction=0
if @window.button_down?(Gosu::KbLeft)
@direction -= 1
end
if @window.button_down?(Gosu::KbRight)
@direction += 1
end
@x += @direction * SPEED * delta
@x=0 if @x @window.width - @@image.width
@[email protected] - @@image.width
end
end
def draw
@@image.draw(@x, @y, Z::Player)
end
end

Dieser Artikel ist Teil einer Reihe. Lesen Sie weitere Artikel über Rapid Game Prototyping in Ruby

 

Mauseingabe

Die Maustasten werden wie Tastatur- und Gamepad-Tasten behandelt. Sie können beide mit button_down abfragen? und Ereignisse mit button_down und button_up . Mausbewegungen dürfen jedoch nur abgefragt werden, es gibt keine Ereignisse für Mausbewegungen. Gosu :: Fenster ‚s mouse_x und mouse_y Verfahren stellen die X- und Y – Koordinaten des Mauszeigers.

Beachten Sie, dass die X- und Y-Koordinaten relativ zum Spielfenster sind. Befindet sich die Maus beispielsweise in der oberen linken Ecke, befindet sie sich in der Nähe der Koordinate (0,0) . Befindet sich der Mauszeiger vollständig außerhalb des Spielfensters, wird weiterhin angezeigt, wo sich der Zeiger relativ zum Fenster befindet. Daher können sowohl mouse_x als auch mouse_y kleiner als Null und größer als die Breite oder Höhe des Fensters sein.

Das folgende Programm zeigt überall dort, wo Sie mit der Maus klicken, ein neues Sprite an. Beachten Sie, dass sowohl ereignisgesteuerte Eingaben (für die Klicks) als auch abfragegesteuerte Eingaben (zum Abrufen der Position der Maus) verwendet werden. Eine vollständige, ausführbare Datei finden Sie hier .


class MyWindow

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.