Vom Übersetzer:
Dies ist eine Fortsetzung einer Reihe von Übersetzungen von Twinklebear-Tutorials, die ursprünglich hier verfügbar waren . Die Übersetzung ist teilweise kostenlos und kann geringfügige Änderungen oder Ergänzungen des Übersetzers enthalten. Die Übersetzung der ersten beiden Lektionen wurde von InvalidPointer verfasst. Bilder aus dem Originalartikel werden unter maximaler Wahrung des Stils des Autors lokalisiert.Liste der Lektionen:Ereignisbehandlung
In dieser Lektion lernen wir die Grundlagen des Abrufens von Benutzereingaben kennen. Zur Vereinfachung des Beispiels wird jede Benutzeraktion als
Fluchtversuch zum Beenden des Programms wahrgenommen. SDL verwendet die Struktur- und Ereignisextraktionsfunktionen von SDL_Event aus der Ereigniswarteschlange, z. B. SDL_PollEvent, um Informationen zu Ereignissen abzurufen. Der im Rahmen dieser Lektion geschriebene Code basiert auf den Ergebnissen der
vorherigen Lektion .
Aber zuerst ändern wir das Bild in der Mitte des Bildschirms, damit der Benutzer, der Ihr Programm zum ersten Mal gesehen hat, versteht, was es tut und was von ihm verlangt wird.
Author Man gespeichertDie einfachste Hauptschleife
Wir werden die
Hauptschleife zum Programm hinzufügen, wodurch das Programm funktioniert, bis der Benutzer das Programm beenden möchte (und das Programm natürlich in zugänglicher Form darüber benachrichtigen möchte), anstatt wie in früheren Lektionen eine feste Verzögerung. Hier ist eine ungefähre Struktur dieses Zyklus:
while (!quit)
SDL-Ereigniswarteschlange
Um das SDL-Ereignissystem ordnungsgemäß zu verwenden, benötigen wir mindestens ein minimales Verständnis seiner Funktionsweise. Wenn die SDL ein Ereignis vom Betriebssystem empfängt, stellt sie es nach allen anderen Ereignissen, die zuvor empfangen, aber noch nicht aus dem Programm extrahiert wurden, am Ende der Warteschlange ab. Wenn wir nach dem Starten des Programms die Größe des Fensters abwechselnd ändern, darauf klicken und auf einen Schlüssel klicken, sieht die Ereigniswarteschlange folgendermaßen aus:

Wenn wir SDL_PollEvent aufrufen, erhalten wir am Anfang der Warteschlange ein Ereignis, das älteste der verbleibenden. Wenn Sie Ereignisse mit SDL_PollEvent aus der Warteschlange empfangen, werden sie von dort entfernt. Um dies zu vermeiden, können Sie das Ereignis mithilfe der Funktion SDL_PeepEvents mit gesetztem Flag SDL_PEEKEVENT „snoop“. Weitere Informationen zu dieser Funktion finden Sie in der Dokumentation. Sie wird im Rahmen dieses Artikels nicht benötigt (und höchstwahrscheinlich auch) und wird daher nicht berücksichtigt.
Ereignisbehandlung
In der Hauptschleife möchten wir alle verfügbaren Ereignisse empfangen, die nach dem Zeichnen des vorherigen Frames aufgetreten sind, und diese verarbeiten. Setzen Sie dazu einfach SDL_PollEvent in den Zustand der while-Schleife, da es 1 zurückgibt, wenn es das Ereignis empfangen hat, und 0, wenn nichts zu empfangen ist. Da das Programm nur seine Arbeit an bestimmten Ereignissen abschließt, reicht es aus, eine boolesche Variable (bool quit) zu verwenden, die angibt, ob das Programm beendet werden soll oder nicht, und seinen Wert auf true setzt, wenn diese Ereignisse empfangen werden.
Diese Schleife sollte innerhalb der Hauptschleife der Anwendung platziert werden.
Ein Ereignis vom Typ SDL_QUIT tritt auf, wenn der Benutzer das Fenster schließt, SDL_KEYDOWN, wenn die Taste auf der Tastatur gedrückt wird (und tritt viele Male auf, ähnlich wie Buchstaben wiederholt werden, während die Taste beim Drucken von Text gehalten wird), und ein Ereignis vom Typ SDL_MOUSEBUTTONDOWN, wenn Mausklick. Dies sind nur einige der Ereignisse, die Ihre Anwendung empfangen kann - und insgesamt kann die SDL mehr als 20 Arten von Ereignissen empfangen, die in diesem Artikel natürlich nicht behandelt werden können. Lesen Sie sie daher in der Dokumentation zu
SDL_EventAbschluss des Hauptzyklus
Wir haben die Ereignisverarbeitung abgeschlossen, aber in der Hauptschleife fehlt ein weiterer Teil - die Szenenanzeige. Wir haben dieses Thema bereits in früheren Lektionen behandelt, es bleibt nur, dieses Wissen anzuwenden, und der Hauptzyklus wird die folgende Form annehmen:
Dieses Programm wird für immer funktionieren. Nun, oder zumindest bis der Benutzer sie
höflich auffordert aufzuhören. Nach dem Starten des Programms sollte das Drücken der Taste mit einem Kreuz, das Drücken einer beliebigen Taste auf der Tastatur oder das Klicken mit der Maus im Fenster zum Abschluss der Arbeit führen. Und bis zu diesem Moment wird sie den Inhalt des Fensters ständig neu zeichnen.
Ergänzung durch den Übersetzer: Das Programm in der Form, in der es sich befindet, verbraucht höchstwahrscheinlich alle verfügbaren Prozessorressourcen und lädt einen Kern vollständig. Es ist sinnvoll, am Ende des Hauptzyklus mit SDL_Delay eine kleine Verzögerung (1-5 ms) hinzuzufügen, damit das Programm den Prozessor für andere Programme freigibt, wenn keine Ereignisse vorliegen. Dies gilt nicht für schwere Spiele, für die bereits alle verfügbaren Ressourcen erforderlich sind, wenn es bei 100 fps ein unzulässiger Luxus ist, 100 ms pro Sekunde für das Warten aufzuwenden.Das Ende der vierten Lektion
So ging die nächste Lektion zu Ende. Wir sehen uns alle in Lektion 5: Probenahme aus einem Texturatlas
Hausaufgaben: Versuchen Sie,
Bildbewegungen hinzuzufügen, indem Sie beispielsweise die Pfeile verwenden.