7 days of WordPress themes, graphics & videos - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Game Development
  2. Programming

Erstellung von einem Neon Vector Shooter in XNA: Basic Gameplay

Read Time: 11 mins
This post is part of a series called Cross-Platform Vector Shooter: XNA.
Make a Neon Vector Shooter in XNA: More Gameplay

German (Deutsch) translation by Alex Grigorovich (you can also view the original English article)

In dieser Reihe von Tutorials zeige ich Ihnen, wie Sie in XNA einen Neon-Twin-Stick-Shooter wie Geometry Wars, den wir Shape Blaster nennen, erstellen. Das Ziel dieser Tutorials ist es nicht, Ihnen eine exakte Nachbildung von Geometry Wars zu hinterlassen, sondern die erforderlichen Elemente zu erläutern, mit denen Sie Ihre eigene hochwertige Variante erstellen können.

Ich ermutige Sie, den in diesen Tutorials angegebenen Code zu erweitern und damit zu experimentieren. Wir werden diese Themen in der gesamten Serie behandeln:

  1. Richten Sie das grundlegende Gameplay ein, erstellen Sie das Schiff des Spielers und verarbeiten Sie Eingaben, Sound und Musik.
  2. Beenden Sie die Implementierung der Spielmechanik, indem Sie die Feinde hinzufügen, die Kollisionserkennung übernehmen und die Punktzahl und das Leben des Spielers verfolgen.
  3. Fügen Sie einen Bloom-Filter hinzu. Dieser Effekt verleiht den Grafiken ein Neonlicht.
  4. Fügen Sie die verrückten, übertriebenen Partikeleffekte hinzu.
  5. Fügen Sie das Warping-Hintergrundraster hinzu.

Folgendes haben wir am Ende der Serie:

Und hier ist, was wir am Ende dieses ersten Teils haben werden:

Die Musik und Soundeffekte, die Sie in diesen Videos hören können, wurden von RetroModular erstellt, und Sie können bei Audiotuts+ nachlesen, wie er dies getan hat.

Die Sprites stammen von Jacob Zinman-Jeanes, unserem ansässigen Tuts+ Designer. Alle Grafiken finden Sie in der Quelldatei Download Zip.

Shape_Blaster_SpritesShape_Blaster_SpritesShape_Blaster_Sprites
Die Schrift ist Nova Square von Wojciech Kalinowski.

Lassen Sie uns anfangen.


Überblick

In diesem Tutorial erstellen wir einen Twin-Stick-Shooter. Der Spieler steuert das Schiff mit der Tastatur, der Tastatur und der Maus oder den beiden Daumenstiften eines Gamepads.

Wir verwenden eine Reihe von Klassen, um dies zu erreichen:

  • Entity: Die Basisklasse für Feinde, Kugeln und das Schiff des Spielers. Entitäten können sich bewegen und gezeichnet werden.
  • Bullet und PlayerShip.
  • EntityManager: Verfolgt alle Entitäten im Spiel und führt eine Kollisionserkennung durch.
  • Input: Hilft bei der Verwaltung von Eingaben über Tastatur, Maus und Gamepad.
  • Art: Lädt und enthält Verweise auf die für das Spiel benötigten Texturen.
  • Sound: Lädt und enthält Verweise auf Sounds und Musik.
  • MathUtil und Extensions: Enthält einige hilfreiche statische Methoden und Erweiterungsmethoden.
  • GameRoot: Steuert die Hauptschleife des Spiels. Dies ist die Game1-Klasse, die XNA automatisch generiert und umbenannt.

Der Code in diesem Tutorial soll einfach und leicht verständlich sein. Es wird nicht alle Funktionen oder eine komplizierte Architektur haben, um alle möglichen Anforderungen zu erfüllen. Vielmehr wird es nur das tun, was es tun muss. Wenn Sie es einfach halten, können Sie die Konzepte leichter verstehen und sie dann modifizieren und zu Ihrem eigenen einzigartigen Spiel erweitern.


Entitäten und das Schiff des Spielers

Erstellen Sie ein neues XNA-Projekt. Benennen Sie die Game1-Klasse in eine geeignetere um. Ich habe es GameRoot genannt.

Beginnen wir nun mit der Erstellung einer Basisklasse für unsere Spieleinheiten.

Alle unsere Wesenheiten (Feinde, Kugeln und das Schiff des Spielers) haben einige grundlegende Eigenschaften wie ein Bild und eine Position. IsExpired wird verwendet, um anzuzeigen, dass die Entität zerstört wurde und aus allen Listen entfernt werden sollte, die einen Verweis darauf enthalten.

Als Nächstes erstellen wir einen EntityManager, um unsere Entitäten zu verfolgen und zu aktualisieren und zu zeichnen.

Denken Sie daran, dass Sie eine Ausnahme erhalten, wenn Sie eine Liste ändern, während Sie sie durchlaufen. Der obige Code sorgt dafür, dass alle während der Aktualisierung hinzugefügten Entitäten in einer separaten Liste in die Warteschlange gestellt und nach Abschluss der Aktualisierung der vorhandenen Entitäten hinzugefügt werden.

Sichtbar machen

Wir müssen einige Texturen laden, wenn wir etwas zeichnen wollen. Wir werden eine statische Klasse erstellen, die Verweise auf alle unsere Texturen enthält.

Laden Sie die Grafik, indem Sie Art.Load(Content) in GameRoot.LoadContent() aufrufen. Außerdem müssen einige Klassen die Bildschirmabmessungen kennen. Fügen Sie GameRoot daher die folgenden Eigenschaften hinzu:

Fügen Sie im GameRoot-Konstruktor hinzu:

Jetzt schreiben wir die PlayerShip-Klasse.

Wir haben PlayerShip zu einem Singleton gemacht, sein Bild festgelegt und es in der Mitte des Bildschirms platziert.

Zum Schluss fügen wir das Spielerschiff zum EntityManager hinzu und aktualisieren und zeichnen es. Füge den folgenden Code in GameRoot hinzu:

Wir zeichnen die Sprites mit einer additiven Mischung, die Teil dessen ist, was ihnen ihren Neon-Look verleiht. Wenn Sie das Spiel zu diesem Zeitpunkt ausführen, sollten Sie Ihr Schiff in der Mitte des Bildschirms sehen. Es reagiert jedoch noch nicht auf Eingaben. Lassen Sie uns das beheben.


Input

Für die Bewegung kann der Spieler WASD auf der Tastatur oder den linken Daumenstift auf einem Gamepad verwenden. Zum Zielen können sie die Pfeiltasten, den rechten Daumenstiel oder die Maus verwenden. Der Spieler muss zum Schießen nicht die Maustaste gedrückt halten, da es unangenehm ist, die Taste kontinuierlich zu halten. Dies lässt uns ein kleines Problem zurück: Woher wissen wir, ob der Spieler mit der Maus, der Tastatur oder dem Gamepad zielt?

Wir werden das folgende System verwenden: Wir werden Tastatur- und Gamepad-Eingaben zusammenfügen. Wenn der Spieler die Maus bewegt, wechseln wir zum Mausziel. Wenn der Spieler die Pfeiltasten drückt oder den rechten Daumenstiel verwendet, schalten wir das Zielen mit der Maus aus.

Eines ist zu beachten: Wenn Sie einen Daumen nach vorne drücken, wird ein positiver y-Wert zurückgegeben. In Bildschirmkoordinaten steigen die y-Werte nach unten. Wir möchten die y-Achse auf dem Controller umkehren, damit das Drücken des Daumensticks nach oben zielt oder uns zum oberen Bildschirmrand bewegt.

Wir werden eine statische Klasse erstellen, um die verschiedenen Eingabegeräte zu verfolgen und um zwischen den verschiedenen Zielarten zu wechseln.

Rufen Sie Input.Update() zu Beginn von GameRoot.Update() auf, damit die Eingabeklasse funktioniert.

Tipp: Sie haben eine Methode für Bomben hinzugefügt. Wir werden jetzt keine Bomben implementieren, aber diese Methode ist für die zukünftige Verwendung da.

Vielleicht stellen Sie auch in GetMovementDirection() fest, dass ich direction.LengthSquared() > 1 geschrieben habe. Die Verwendung von LengthSquared() ist eine kleine Leistungsoptimierung. Das Berechnen des Quadrats der Länge ist etwas schneller als das Berechnen der Länge selbst, da dadurch die relativ langsame Quadratwurzeloperation vermieden wird. Sie sehen den Code anhand der Quadrate der Längen oder Abstände im gesamten Programm. In diesem speziellen Fall ist der Leistungsunterschied vernachlässigbar, aber diese Optimierung kann einen Unterschied machen, wenn sie in engen Schleifen verwendet wird.

Verschiebung

Wir sind jetzt bereit, das Schiff in Bewegung zu setzen. Fügen Sie diesen Code der PlayerShip.Update() -Methode hinzu:

Dadurch bewegt sich das Schiff mit einer Geschwindigkeit von bis zu acht Pixeln pro Bild, klemmt seine Position so, dass es nicht vom Bildschirm abweicht, und dreht das Schiff in die Richtung, in die es sich bewegt.

ToAngle() ist eine einfache Erweiterungsmethode, die in unserer Extensions-Klasse definiert ist:

Schießen

Wenn Sie das Spiel jetzt ausführen, sollten Sie in der Lage sein, das Schiff herumzufliegen. Jetzt lass es uns schießen.

Erstens brauchen wir eine Klasse für Kugeln.

Wir möchten eine kurze Abklingzeit zwischen den Aufzählungszeichen. Fügen Sie daher die folgenden Felder zur PlayerShip-Klasse hinzu.

Fügen Sie außerdem den folgenden Code zu PlayerShip.Update() hinzu.

Dieser Code erstellt zwei Aufzählungszeichen, die parallel zueinander verlaufen. Es fügt der Richtung ein wenig Zufälligkeit hinzu. Dadurch breiten sich die Schüsse ein wenig wie bei einem Maschinengewehr aus. Wir addieren zwei Zufallszahlen, da dies die Wahrscheinlichkeit erhöht, dass ihre Summe zentriert ist (um Null) und die Wahrscheinlichkeit geringer ist, dass Kugeln weit entfernt gesendet werden. Wir verwenden eine Quaternion, um die Ausgangsposition der Kugeln in die Richtung zu drehen, in die sie sich bewegen.

Wir haben auch zwei neue Hilfsmethoden verwendet:

  • Random.NextFloat() gibt einen Float zwischen einem minimalen und einem maximalen Wert zurück.
  • MathUtil.FromPolar() erstellt einen Vektor2 aus einem Winkel und einer Größe.

Benutzerdefinierter Cursor

Es gibt noch eine Sache, die wir jetzt tun sollten, da wir die Input-Klasse haben. Zeichnen wir einen benutzerdefinierten Mauszeiger, damit Sie leichter erkennen können, wohin das Schiff zielt. Zeichnen Sie in GameRoot.Draw einfach Art.Pointer an die Position der Maus.


Abschluss

Wenn Sie das Spiel jetzt testen, können Sie das Schiff mit den WASD-Tasten oder dem linken Daumen bewegen und den kontinuierlichen Strom von Kugeln mit den Pfeiltasten, der Maus oder dem rechten Daumen zielen.

Im nächsten Teil werden wir das Gameplay beenden, indem wir Feinde und eine Punktzahl hinzufügen.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Game Development tutorials. Never miss out on learning about the next big thing.
Advertisement
Scroll to top
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.