Einführung in JavaFX für Game Development

JavaFX ist ein Cross-Plattform-GUI-Toolkit für Java und ist der Nachfolger der Java Swing-Bibliotheken. In diesem Tutorial werden wir die Eigenschaften von JavaFX zu erkunden, die es einfach Spiele in Java zu verwenden, um loszulegen Programmierung.






12 GameDev Motoren und Plattformen (und die besten Möglichkeiten, jeden von ihnen zu lernen)

Michael James Williams

Installation

Grund Framework-Klassen

Erstellen eines JavaFX-Programm beginnt mit der Application-Klasse, von dem alle JavaFX-Anwendungen erweitert werden. Ihre Haupt-Klasse sollte die Markteinführung () -Methode aufrufen, die dann die init () -Methode aufrufen und dann den Start () -Methode, warten Sie auf die Anwendung zu beenden, und dann rufen Sie die stop () -Methode. Von diesem Verfahren ist nur der Anfang () -Methode abstrakt und außer Kraft gesetzt werden muß.

Zu wissen, all dies können wir ein minimales Beispiel schreiben, die ein Fenster in JavaFX startet:

Strukturierung Inhalt

Inhalt in JavaFX (wie Text, Bilder und UI-Steuerelemente) wird unter Verwendung einer baumartigen Datenstruktur organisiert als Szenengraph bekannt. wobei diese Gruppen und ordnet die Elemente einer graphischen Szene.

Ein allgemeines Element eines Szenengraphen in JavaFX wird ein Knoten genannt. Jeder Knoten in einem Baum hat einen einzigen „übergeordneten“ Knoten, mit Ausnahme von einem speziellen Knoten als „root“ bezeichnet. Eine Gruppe ist ein Knoten, der viele „Kind“ Node-Elemente haben. Grafische Transformationen (Translation, Rotation und Skalierung) und auf eine Gruppe angewendet Auswirkungen auch auf seine Kinder gelten. Die Knoten können mit JavaFX Cascading Style Sheets (CSS), ganz ähnlich wie der zu Format HTML-Dokumenten verwendet CSS gestylt werden.

Die Scene-Klasse alle Inhalte für einen Szenengraph enthält, und erfordert einen Wurzelknoten festgelegt wird (in der Praxis ist dies oft eine Gruppe). Sie können gezielt die Größe einer Szene gesetzt; andernfalls wird die Größe einer Szene automatisch basierend auf ihrem Inhalt berechnet werden. Ein Szenenobjekt muss auf die Bühne (von der setScene () Methode) geleitet werden, um angezeigt zu werden.

rendering Graphics

Rendering Grafiken ist besonders wichtig für Spieleprogrammierer! In JavaFX ist das Canvas-Objekt ein Bild auf das wir Text, Formen und Bilder, mit ihrem zugehörigen Graphics Objekt zeichnen. (Für die Entwickler vertraut mit dem Java Swing-Toolkit, das ist ähnlich wie das Graphics-Objekt an der Farbe () -Methode in der JFrame Klasse übergeben.)

Das Objekt Graphics enthält eine Fülle von leistungsstarken Fähigkeiten individuell gestaltet werden. So wählen Sie Farben für das Zeichnen von Text und Formen, können Sie die Füllung (innen) und Schlaganfall (Grenze) Farben gesetzt, welche Farbe Objekte: diese können eine einzelne feste Farbe sein. ein benutzerdefinierter Gradienten (entweder LinearGradient oder RadialGradient) oder sogar ein ImagePattern. Sie können auch ein oder mehrere Effekt Stil Objekte, wie Beleuchtung gelten. Schatten. oder Weichzeichnen. und Änderungs-Schriftart aus dem Standard durch die Font-Klasse.

Die Image-Klasse macht es einfach, Bilder aus einer Vielzahl von Formaten von Dateien zu laden und sie über die Klasse Graphics ziehen. Es ist einfach, unter Verwendung der WritableImage Klasse zusammen mit den PixelReader und PixelWriter Klassen prozedural generierten Bilder zu konstruieren.

Mit diesen Klassen können wir ein viel wert „Hallo, Welt“ -Stil Beispiel wie folgt schreiben. Der Kürze halber werden sind wir nur die Methode start () hier (wir werden die Import-Anweisungen und main () -Methode überspringen); jedoch Code komplette Arbeitsquelle kann in der GitHub Repo zu finden, die dieses Tutorial begleitet.

Die Spielschleife

Als nächstes müssen wir unsere Programme dynamisch gestalten. was bedeutet, dass das Spiel Zustand im Laufe der Zeit ändert. Wir werden eine Spielschleife implementieren. eine unendliche Schleife, die die Spielobjekte aktualisiert und rendert die Szene auf dem Bildschirm, idealerweise mit einer Rate von 60 mal pro Sekunde.

die AnimationTimer-Klasse ist ein bisschen schwierig: Da es sich um eine abstrakte Klasse ist, kann sie nicht direkt-die erstellt werden Klasse erweitert werden muss, bevor eine Instanz erstellt werden. Doch für unsere einfachen Beispielen werden wir die Klasse, indem er eine anonyme innere Klasse erweitern. Diese innere Klasse muss die abstrakte Methode Griff definieren (). das Produkt sei ein einziges Argument übergeben werden: die aktuelle Systemzeit in Nanosekunden. Nachdem die Innen Klasse definieren, rufen wir sofort die Start () Methode, die die Schleife beginnt. (Die Schleife kann durch Aufruf der stop () Methode gestoppt werden.)

Mit diesen Klassen können wir unseren „Hallo Welt“ -Beispiel, die Schaffung eine Animation ändern, bestehend aus der Erdumlaufbahn um die Sonne gegen das Sternenhintergrundbild.

Einführung in JavaFX für Game Development

Es gibt alternative Möglichkeiten, um eine Spielschleife in JavaFX zu implementieren. Ein etwas längere (aber flexibler) Ansatz beinhaltet die Timeline-Klasse, die eine Animationssequenz ist, die aus einer Reihe von Keyframe-Objekten. Um ein Spiel Schleife zu erstellen, sollte die Zeitleiste festgelegt wird auf unbestimmte Zeit zu wiederholen, und nur eine einzige KeyFrame erforderlich ist, mit seiner Dauer auf 0,016 Sekunden (erreichen 60 Zyklen pro Sekunde). Diese Implementierung kann in der Example3T.java Datei im GitHub Repo zu finden.






Frame-basierte Animation

Eine weitere, häufig benötigte Spiele-Programmierung Komponente ist rahmenbasierte Animation: eine Folge von Bildern in schnellen Folge der Anzeige die Illusion von Bewegung zu erzeugen.

Unter der Annahme, dass alle Animationen Schleife und alle Rahmen für die gleiche Anzahl von Sekunden angezeigt werden, kann eine Basisimplementierung so einfach sein, wie folgt:

Um diese Klasse in dem vorherigen Beispiel zu integrieren, könnten wir eine animierte UFO erstellen. Initialisieren des Objekts mit dem Code:

und innerhalb des AnimationTimer und fügte hinzu, die einzige Zeile Code:

an der entsprechenden Stelle. Für ein vollständiges Arbeitscodebeispiel finden Sie in die Datei Example3AI.java im GitHub Repo.

Umgang mit Benutzereingaben

Erfassung und Verarbeitung von Benutzereingaben in JavaFX ist unkompliziert. Benutzeraktionen, die vom System erkannt werden können, wie zB Tastendrücke und Mausklicks werden Ereignisse genannt. In JavaFX verursachen diese Aktionen automatisch die Erzeugung von Objekten (wie KeyEvent und Mouseevent), die die zugeordneten Datenspeicher (wie beispielsweise der tatsächlichen Taste gedrückt oder der Position des Mauszeigers). Jede JavaFX Klasse, die die Eventtarget-Klasse implementiert, wie zum Beispiel einer Szene, kann „hören“ für Veranstaltungen und mit ihnen umgehen; in den Beispielen, die folgen, zeigen wir, wie man eine Szene einzurichten verschiedene Ereignisse zu verarbeiten.

Der Blick durch die Dokumentation für die Scene-Klasse gibt es viele Methoden, die für den Umgang mit verschiedenen Arten von Input aus unterschiedlichen Quellen zu hören. Zum Beispiel setOnKeyPressed das Verfahren () kann ein Eventhandler zuweisen, der aktiviert wird, wenn eine Taste gedrückt wird, wobei das Verfahren setOnMouseClicked () kann ein Eventhandler zuweisen, wenn eine Maustaste aktiviert wird, gedrückt wird, und so weiter. Das Eventhandler Klasse dient einem Zweck: ein Verfahren (so genannte Handgriff ()) zu verkapseln, die aufgerufen wird, wenn das entsprechende Ereignis auftritt.

Umgang mit Keyboard Events

Die Benutzereingabe wird oft im Hauptspiel Schleife verarbeitet und damit ein Datensatz muss, welche Schlüssel gehalten werden derzeit aktiv sind. Eine Möglichkeit, dies zu tun ist durch eine Arraylist von String-Objekten zu erstellen. Wenn eine Taste gedrückt wird zunächst, fügen wir die String-Darstellung des KeyCode des KeyEvent auf der Liste; wenn die Taste losgelassen wird, entfernen wir sie aus der Liste.

Im Beispiel unten enthält die Leinwand zwei Bilder von Pfeiltasten; immer dann, wenn eine Taste gedrückt wird, wird das entsprechende Bild grün.

Einführung in JavaFX für Game Development

Der Quellcode wird in der Datei Example4K.java im GitHub Repo enthalten.

Umgang mit Maus Event

Lassen Sie uns nun ein Beispiel an, das auf der Mouseevent-Klasse konzentriert sich eher als die KeyEvent Klasse. In diesem Mini-Spiel erhält der Spieler einen Punkt jedes Mal, wird das Ziel angeklickt.

Einführung in JavaFX für Game Development

Da die Eventhandler innere Klassen sind, müssen alle Variablen verwenden sie endgültig oder „effektiv final“, was bedeutet, dass die Variablen nicht neu initialisiert werden. Im vorigen Beispiel wurden die Daten an die Eventhandler mittels einem Array vergangen, kann deren Werte ohne Reinitialisierung geändert wird (über die add () und () entfernen Methoden).

im Fall von grundlegenden Datentypen, jedoch können die Werte nicht einmal initialisiert geändert werden. Wenn Sie die Eventhandler mögen grundlegende Datentypen zuzugreifen, die an anderer Stelle im Programm geändert werden, können Sie eine Wrapper-Klasse erstellen, die entweder öffentliche Variablen oder Getter / Setter-Methoden enthalten. (In dem Beispiel unten ist intValue eine Klasse, die einen public int Variable namens Wert enthält.)

Der vollständige Quellcode ist in dem GitHub Repo enthalten ist; die Hauptklasse ist Example4M.java.

Erstellen eines einfachen Sprite Klasse mit JavaFX

In Videospielen, ist ein Sprit der Begriff für eine einzelne optische Einheit. Unten ist ein Beispiel für eine Sprite-Klasse, die ein Bild und die Position sowie Geschwindigkeitsinformationen (für mobile Einheiten) und Breite / Höheninformation Begrenzungskästen für die Zwecke der Kollisionserkennung zu verwenden, bei der Berechnung speichert. Wir haben auch die Standard-Getter / Setter-Methoden für die meisten dieser Daten (der Kürze halber weggelassen), und einige Standard in der Spieleentwicklung benötigt Methoden:

  • aktualisieren(). berechnet die neue Position auf der Geschwindigkeit des Sprite basiert.
  • machen(). zieht das assoziierte Bild auf die Leinwand (über die Graphics Klasse), um die Position als Koordinaten.
  • getBoundary (). in der Kollisionserkennung gibt ein JavaFX Rectangle2D Objekt, nützlich wegen seiner intersects Methode.
  • (Intersects). bestimmt, ob die Bounding-Box des Sprite mit dem eines anderen Sprite schneidet.

Der vollständige Quellcode ist in Sprite.java im GitHub Repo enthalten.

Mit Hilfe der Sprite-Klasse

Mit Hilfe der Klasse Spriten, können wir leicht ein einfaches Sammelspiel in JavaFX erstellen. In diesem Spiel übernehmen Sie die Rolle eines empfindungsfähigen Aktentasche, deren Ziel es ist, die viele Geldsäcke zu sammeln, die von einem sorglosen Vorbesitzers herumliegen gelassen wurden. Mit den Pfeiltasten bewegen Sie den Spieler über den Bildschirm.

Einführung in JavaFX für Game Development

Dieser Code lehnt sich stark von den vorherigen Beispielen: Fonts Einrichten der Partitur angezeigt werden, die Tastatureingabe mit einem Arraylist speichern, mit einem AnimationTimer das Spiel Schleife Implementierung und Wrapper-Klassen für einfache Werte schaffen, die während des Spiels Schleife geändert werden müssen.

Ein Code-Segment von besonderem Interesse beinhaltet für den Spieler ein Sprite-Objekt erstellen (Aktentasche) und eine Arraylist von Sprite-Objekten für die Sammlerstücke (Geldbeutel):

Ein weiteres Code-Segment von Interesse ist die Schaffung des AnimationTimer. das hat die Aufgabe, mit:

  • Berechnung der seit der letzten Aktualisierung verstrichene Zeit
  • Einstellung der Spieler Geschwindigkeit auf den Tasten in Abhängigkeit zur Zeit gedrückt
  • Durchführen Kollisionserkennung zwischen dem Spieler und Sammlerstücke, und die Partitur und die Liste der Sammler aktualisieren, wenn dies der Fall ist (wird ein Iterator verwendet statt der Arraylist direkt eine gleichzeitige Änderung Ausnahme zu vermeiden, wenn Objekte aus der Liste zu entfernen)
  • Rendern der Sprites und Text auf die Leinwand

Wie üblich kann vollständiger Code in der beigefügten Code-Datei (Example5.java) im GitHub Repo zu finden.

Nächste Schritte

Schlussfolgerung

In diesem Tutorial habe ich Ihnen JavaFX Klassen eingeführt, die in der Spieleprogrammierung nützlich sind. Wir arbeiteten durch eine Reihe von Beispielen für die Komplexität zu erhöhen, die ihren Höhepunkt in einem Sprite-basierte Sammlung-Stil Spiel. Jetzt sind Sie bereit, einige der Ressourcen der oben aufgeführten entweder zu untersuchen oder zu tauchen und starten Sie Ihr eigenes Spiel zu erstellen. Viel Glück für Sie in Ihren Bemühungen!

12 GameDev Motoren und Plattformen (und die besten Möglichkeiten, jeden von ihnen zu lernen)

Michael James Williams







In Verbindung stehende Artikel