Erstellen Sie ein einfaches Space-Shooter-Spiel in HTML5 mit EaselJS

Letztes Jahr habe ich Ihnen gezeigt, wie Sie mit Flash und AS3 ein Ballerspiel erstellen können. Mit zunehmender Beliebtheit (und Funktionen) von HTML5 möchten wir uns ansehen, wie HTML5, JavaScript und EaselJS das Gleiche tun.


Endergebnisvorschau

Werfen wir einen Blick auf das Endergebnis, auf das wir hinarbeiten:


Klicken Sie hier, um die Demo zu spielen.


Schritt 1: Kurzübersicht

Mit vorgefertigten Sprites werden wir ein unterhaltsames Programm erstellen Weltraum-Shooter Spiel in HTML5 mit der EaselJS-Bibliothek.

Der Spieler kann ein Raumschiff steuern und mehrere Feinde schießen, während er im Weltraum unterwegs ist.


Schritt 2: Schnittstelle

Es wird eine einfache und futuristische Schnittstelle verwendet, dazu gehören Bitmaps und mehr. Ich habe in der Demo dieses Tutorials eine großartige Sprite-Bibliothek verwendet, die Teil der kostenlosen Sinistar-Klongrafik ist.

Die für dieses Lernprogramm erforderlichen Schnittstellenressourcen finden Sie im beigefügten Download.


Schritt 3: Holen Sie sich EaselJS

Die EaselJS-Bibliothek wird zum Erstellen unseres Spiels verwendet. Stellen Sie sicher, dass Sie das lesen Fertig machen Tutorial, wenn Sie neu in dieser Bibliothek sind.

Sie können EaselJS von der offiziellen Website herunterladen.


Schritt 4: HTML-Struktur

Lassen Sie uns unser HTML-Dokument vorbereiten, es ist eine einfache HTML-Struktur, um mit dem Schreiben unserer App zu beginnen. Speichern Sie dies als Shooter.html.

    Schütze    

Schritt 5: Mobiles Hightlight ausblenden

Fügen wir noch ein wenig CSS hinzu. Diese Zeile entfernt die Standardhervorhebung, wenn Sie mit einem mobilen Browser auf ein Element tippen. Andernfalls würde das mobile Erlebnis drastisch abnehmen.

    Schütze     

Schritt 6: JavaScript-Bibliotheken

Mit dem folgenden Code werden die erforderlichen JavaScript-Bibliotheken hinzugefügt, damit unsere App funktionieren kann.

    Schütze         

Main.js In dieser Datei werden alle unsere eigenen Funktionen für das Spiel gespeichert. Erstellen Sie es jetzt und speichern Sie es im selben Ordner wie Shooter.html. Sie müssen auch die aufgeführten EaselJS-Bibliotheken herunterladen.


Schritt 7: Hauptfunktion aufrufen

In den nächsten Zeilen nennen wir unsere Hauptfunktion; Dies ist die Funktion, mit der unsere Anwendung gestartet wird. Sie wird später in unserem JavaScript-Code erstellt.

    Schütze         

Schritt 8: Leinwandelement

Der Canvas wird in diese Zeile eingefügt. Wir weisen eine ID zu, um sie später zu referenzieren, und legen deren Breite und Höhe fest.

    Schütze          

Schritt 9: Starten Sie das JavaScript

Beginnen wir mit der Erstellung des Spiels!

Öffnen Sie Ihren bevorzugten JavaScript-Editor (jeder Texteditor wird funktionieren, aber Sie haben keine Syntax-Hervorhebung). Bereiten Sie sich darauf vor, Ihr fantastisches Spiel zu schreiben. Öffne das Main.js Datei, die Sie zuvor erstellt haben.


Schritt 10: Leinwand definieren

Wir beginnen mit der Definition aller Grafik- und Logikvariablen.

Die nächsten Variablen repräsentieren das HTML-Canvas-Element und die Bühne, auf die es verweist. (Das Bühne Variable verhält sich ähnlich wie die Bühne in einem AS3 Flash-Projekt.)

 / * Leinwand definieren * / var Leinwand; var Stufe;

Schritt 11: Hintergrund

Die nächsten Variablen speichern die Hintergrundbilder. Zwei gekachelte Bilder werden verwendet, um einen unendlich scrollenden Hintergrund zu erstellen.

 / * Hintergrund * / var bgImg = neues Bild (); var bg; var bg2Img = neues Bild (); var bg2;

Schritt 12: Schiff

Dies ist das Schiff, das als Spielercharakter oder Held verwendet wird.

 / * Ship * / var sImg = neues Bild (); var Schiff;

Schritt 13: Feind

Mehrere Feinde werden auf der Bühne sein; Sie werden dies als Quellgrafik verwenden.

 / * Feind * / var eImg = neues Bild ();

Schritt 14: Boss

Ein Boss ist im Spiel anwesend, größer und mit mehr Gesundheit als die anderen Feinde. Diese Variablen werden verwendet, um es zu instanziieren.

 / * Boss * / var bImg = neues Bild (); var Chef;

Schritt 15: Lebt

Das Symbol "Leben". Zu Beginn gibt es drei Leben, und Sie verlieren eines, wenn Sie von einem Feind getroffen werden.

 / * Lives * / var lImg = neues Bild ();

Schritt 16: Kugeln

Dies ist deine Waffe: feuere Kugeln auf die Feinde, um sie zu töten. Diese Variable speichert das Quellbild.

 / * Bullets * / var bltImg = neues Bild ();

Schritt 17: Warngrafik

Im Spiel werden zwei Alarme verwendet, eine für den Gewinn und eine für den Verlust. Wie Sie einen Gewinn oder Verlust ermitteln, erfahren Sie später in diesem Tutorial.

 / * Alert * / var winImg = neues Bild (); var loseImg = neues Bild (); var win; var verlieren;

Schritt 16: Variablen

Dies sind die Variablen, die wir verwenden. Lesen Sie die Kommentare im Code, um mehr darüber zu erfahren. Einige ihrer Namen sind selbsterklärend und haben daher keine Kommentare.

 var Leben = neuer Container (); // speichert die Leben gfx var bullets = new Container (); // speichert die Aufzählungszeichen gfx var enemies = new Container (); // speichert die Feinde gfx var bossHealth = 20; var score; var gfxLoaded = 0; // als Preloader verwendet, zählt die bereits geladenen Elemente var centerX = 160; var centerY = 240; var tkr = neues Objekt (); // als Ticker-Listener verwendet var timerSource; // verweist auf eine setInterval-Methode

Schritt 17: Sounds

Wir werden Soundeffekte verwenden, um das Spielgefühl zu verbessern. Sie finden die in diesem Beispiel verwendeten Sounds auf Soungle.com mithilfe der Schlüsselwörter Platz, Explosion und Laser-.


Schritt 18: Hauptfunktion

Das Main() Funktion wird die erste sein, die ausgeführt wird, wenn die Webseite geladen wird, da auf sie verwiesen wird onload Attribut des HTML-Dokuments (siehe Schritt 7).

Es ruft die notwendigen Funktionen auf, um das Spiel zu starten. Wir werden diese Funktionen in den nächsten Schritten erstellen - alles von Schritt 19 bis Schritt 23 sollte in diese Funktion einfließen.

 Funktion Main () // Code…

Schritt 19: Leinwand verbinden

Dieser Code ruft die HTML-Zeichenbereichs-ID ab und verknüpft sie mit der EaselJS Stage-Klasse. Dadurch wird die Stage-Variable wie die Stage-Klasse in AS3.

 / * Link Canvas * / canvas = document.getElementById ('Shooter'); Bühne = neue Bühne (Leinwand);

Schritt 20: Aktivieren Sie die Mausereignisse

Mausereignisse sind in EaselJS standardmäßig deaktiviert, um die Leistung zu verbessern. Da wir diese im Spiel brauchen, fügen wir die folgende Zeile hinzu.

 stage.mouseEventsEnabled = true;

Schritt 21: Sounds laden

Wir werden SoundJS verwenden, um Sounds zu unserem Spiel hinzuzufügen. SoundJS addBatch Die Methode verwendet für jeden Aufruf ein Array von drei Parametern:

  • Name: Der Name der Instanz, die der Sound haben soll - dies wird später für die Wiedergabe des Sounds verwendet.
  • src: Die URL der Sounddatei.
  • Instanzen: Die Anzahl der Instanzen, die gleichzeitig abgespielt werden können.
 / * Sound * / SoundJS.addBatch ([name: 'boss', src: 'boss.mp3', instanzen: 1, name: 'explo', src: 'explo.mp3', instanzen: 10, Name: 'shot', src: 'shot.mp3', Instanzen: 10]);

Schritt 22: Laden Sie die Grafik

Dieser Code wird verwendet, um die Grafiken mithilfe einer Funktion, die wir später schreiben werden, vorab zu laden. Es zeigt jedes zuvor erstellte Image-Objekt auf die PNG-Quelldatei in unserem Dokumentordner. Es wird ein Name gegeben, um festzustellen, welches Bild geladen ist, und schließlich wird die Funktion aufgerufen, die die geladenen Bilder verarbeitet.

 / * GFX laden * / bgImg.src = 'bg.png'; bgImg.name = 'bg'; bgImg.onload = loadGfx; bg2Img.src = 'bg2.png'; bg2Img.name = 'bg2'; bg2Img.onload = loadGfx; sImg.src = 'ship.png'; sImg.name = 'Schiff'; sImg.onload = loadGfx; eImg.src = 'enemy1.png'; eImg.name = 'Feind'; eImg.onload = loadGfx; bImg.src = 'boss.png'; bImg.name = 'Chef'; bImg.onload = loadGfx; lImg.src = 'live.png'; lImg.name = 'live'; lImg.onload = loadGfx; bltImg.src = 'bullet.png'; bltImg.name = 'bullet'; bltImg.onload = loadGfx; winImg.src = 'win.png'; winImg.name = 'win'; winImg.onload = loadGfx; loseImg.src = 'lose.png'; loseImg.name = 'verlieren'; loseImg.onload = loadGfx;

Schritt 23: Ticker setzen

Die Ticker-Klasse bietet einen zentralisierten "Tick", der in einem festgelegten Intervall gesendet wird. Wir können es benutzen Tick() Funktion, um bestimmten Code in regelmäßigen Abständen auszuführen.

Der folgende Code setzt die Framerate auf 30 und definiert die Bühne als Listener für die Ticks.

Die TweenJS-Klasse hört auf dieses Häkchen, um die Animationen auszuführen.

 / * Ticker * / Ticker.setFPS (30); Ticker.addListener (stage);

Schritt 24: Vorlade-Funktion

Jedes Mal, wenn eine Grafik geladen wird, wird diese Funktion ausgeführt. Jedes Bild wird einem Bitmap-Objekt zugewiesen und vor dem Aufruf überprüft, ob alle Elemente geladen sind addGameView.

 Funktion loadGfx (e) if (e.target.name = 'bg') bg = neue Bitmap (bgImg); if (e.target.name = 'bg2') bg2 = neue Bitmap (bg2Img); if (e.target.name = 'ship') ship = new Bitmap (sImg); gfxLoaded ++; if (gfxLoaded == 9) addGameView (); 

Schritt 25: Spielansicht hinzufügen

Wenn alle Grafiken geladen sind addGameView Funktion wird aufgerufen. Diese Funktion fügt das Schiff, den Lebenszeitzähler, die Punktzahl und die Hintergründe der Bühne hinzu.

 function addGameView () ship.x = centerX - 18.5; ship.y = 480 + 34; / * Leben hinzufügen * / für (var i = 0; i < 3; i++)  var l = new Bitmap(lImg); l.x = 248 + (25 * i); l.y = 463; lives.addChild(l); stage.update();  /* Score Text */ score = new Text('0', 'bold 14px Courier New', '#FFFFFF'); score.maxWidth = 1000; //fix for Chrome 17 score.x = 2; score.y = 476; /* Second Background */ bg2.y = -480; /* Add gfx to stage and Tween Ship */ stage.addChild(bg, bg2, ship, enemies, bullets, lives, score); Tween.get(ship).to(y:425, 1000).call(startGame); 

Schritt 26: Schiff verschieben

Das Schiff des Spielers wird mit der Maus gesteuert und wir verwenden diese Funktion, um das zu handhaben:

 Funktion moveShip (e) ship.x = e.stageX - 18.5; 

e.stageX bezieht sich auf die x-Koordinate der Maus und diese Funktion wird bei jeder Bewegung der Maus aufgerufen.


Schritt 27: Schießen Sie

Unser Schiff kann Kugeln abschießen, um es zu zerstören und sich vor Feinden zu schützen. Diese Funktion wird jedes Mal ausgeführt, wenn der Benutzer auf die Bühne klickt, und eine Kugel wird vor dem Schiff platziert, die später von der Station verschoben wird aktualisieren() Funktion. Es spielt auch ein Schießgeräusch.

 Funktion shoot () var b = neue Bitmap (bltImg); b.x = Schiff.x + 13; b.y = ship.y - 20; bullets.addChild (b); stage.update (); SoundJS.play ('shot'); 

Schritt 28: Fügen Sie die Feindfunktion hinzu

Es wäre kein Schütze ohne etwas zum Schießen. Hier ein setInterval () wird verwendet, um alle 1000 Millisekunden einen Feind zu erstellen (Sie können diesen Wert im nächsten Schritt ändern), der später vom verschoben wird aktualisieren() Funktion.

 function addEnemy () var e = neues Bitmap (eImg); e.x = Math.floor (Math.random () * (320 - 50)) e.y = -50 Feinde.addChild (e); stage.update (); 

Schritt 29: Spiel starten

Diese Zeilen fügen der Bühne und dem Timer die erforderlichen Zuhörer hinzu. Dazu gehören Mausereignisse, zeitgesteuerte Ereignisse (über setInterval) und Ticker-Events, die das Spiel bei jedem Frame aktualisieren.

 function startGame () stage.onMouseMove = moveShip; bg.onPress = schießen; bg2.onPress = schießen; Ticker.addListener (tkr, false); tkr.tick = Update; timerSource = setInterval ('addEnemy ()', 1000); 

Schritt 30: Hintergrund verschieben

Der Hintergrund wird bei jedem Frame verschoben, um die Raumfahrt zu simulieren. Wenn das untere Hintergrund-Sprite die Bühnengrenze erreicht, wird es wieder nach oben verschoben, wodurch eine Endlosschleife entsteht.

 Funktionsaktualisierung () / * Hintergrund verschieben * / bg.y + = 5; bg2.y + = 5; if (bg.y> = 480) bg.y = -480;  else if (bg2.y> = 480) bg2.y = -480; 

Schritt 31: Kugeln verschieben

Die nächsten Codezeilen prüfen, ob sich Aufzählungszeichen befinden. Wenn ja, werden die Kugeln nach oben bewegt.

 / * Move Bullets * / for (var i = 0; i < bullets.children.length; i++)  bullets.children[i].y -= 10; 

Schritt 32: Entfernen Sie die Offstage-Kugeln

Fügen Sie einige Zeilen hinzu, um die Position des Aufzählungszeichens zu ermitteln, und verwenden Sie diese Option, um ein Geschoss zu zerstören, wenn es nicht mehr sichtbar ist.

 / * Move Bullets * / for (var i = 0; i < bullets.children.length; i++)  bullets.children[i].y -= 10; /* Remove Offstage Bullets */ if(bullets.children[i].y < - 20)  bullets.removeChildAt(i);  

Schritt 33: Boss anzeigen

Wir werden dem Spiel einen großen bösen Boss hinzufügen. Wenn der Benutzer eine bestimmte Punktzahl erreicht, wird der Chef angezeigt:

 / * Boss anzeigen * / if (parseInt (score.text)> = 500 && boss == null) boss = neues Bitmap (bImg); SoundJS.play ("Chef"); boss.x = centerX - 90; boss.y = -183; stage.addChild (Chef); Tween.get (Boss) .to (y: 40, 2000) // Tween den Boss auf die Spielfläche

Schritt 34: Feinde bewegen

Die Feinde werden ebenso wie die Kugeln bei jedem Bild bewegt. Dieser Code findet alle Gegner auf der Bühne mithilfe von Feinde Container und bewegt sie jeweils um 5 Pixel nach unten.

 / * Bewegt Feinde * / für (var j = 0; j < enemies.children.length; j++)  enemies.children[j].y += 5;

Schritt 35: Entfernen Sie Off-Stage-Feinde

Wir überprüfen auch die Positionen der Feinde, um sie zu zerstören, wenn sie nicht mehr sichtbar sind.

 / * Bewegt Feinde * / für (var j = 0; j < enemies.children.length; j++)  enemies.children[j].y += 5; /* Remove Offstage Enemies */ if(enemies.children[j].y > 480 + 50) Feinde.RemoveChildAt (j); 

Schritt 36: Bullet - Enemy Collision

Die Kugeln im Container werden auf Kollision mit den Feinden getestet. In diesem Fall werden beide von der Bühne entfernt, ein Sound wird abgespielt und die Partitur wird aktualisiert.

 für (var k = 0; k < bullets.children.length; k++)  /* Bullet - Enemy Collision */ if(bullets.children[k].x >= enemies.children [j] .x && bullets.children [k] .x + 11 < enemies.children[j].x + 49 && bullets.children[k].y < enemies.children[j].y + 40)  bullets.removeChildAt(k); enemies.removeChildAt(j); stage.update(); SoundJS.play('explo'); score.text = parseFloat(score.text + 50); 

Schritt 37: Bullet - Boss Collision

Der folgende Code behandelt die Bosskollisionen. Er verwendet die gleiche Methode, die in der Bullet-Feind-Kollisionsschleife verwendet wird. Hier benutzen wir die ChefGesundheit Variable, um zu bestimmen, wann der Boss besiegt ist.

 / * Bullet - Boss Collision * / if (Boss! = Null && bullets.children [k] .x> = boss.x && bullets.children [k] .x + 11 < boss.x + 183 && bullets.children[k].y < boss.y + 162)  bullets.removeChildAt(k); bossHealth--; stage.update(); SoundJS.play('explo'); score.text = parseInt(score.text + 50);  

Schritt 38: Schiff - Feindkollision

Hier prüfen wir, ob ein Feind mit dem Schiff des Spielers kollidiert. Wenn dies der Fall ist, wird ein Ton abgespielt, ein Leben entfernt und das Schiff animiert.

 / * Ship - Feindliche Kollision * / if (enemies.hitTest (ship.x, ship.y) || enemies.hitTest (ship.x + 37, ship.y)) enemies.removeChildAt (j); lives.removeChildAt (lives.length); ship.y = 480 + 34; Tween.get (ship) .to (y: 425, 500) SoundJS.play ('explo'); 

Schritt 39: Überprüfen Sie auf Gewinn oder Verlust

Der Spieler gewinnt, wenn der Chef all seine Gesundheit verliert und verliert, wenn alle eigenen Leben verloren gehen. Die nächsten Zeilen erkennen diese Situationen und rufen eine Alarmfunktion mit dem richtigen Parameter auf.

 / * Check for win * / if (boss! = Null && bossHealth <= 0)  alert('win');  /* Check for lose */ if(lives.children.length <= 0)  alert('lose');  

Schritt 40: Alarm

Der Alarm zeigt dem Spieler Informationen zum Status des Spiels an. Es wird angezeigt, wenn ein Spielereignis erreicht ist. Es entfernt die Spieler des Spiels und zeigt die entsprechende Nachricht an.

 Funktionsalarm (e) / * Listeners entfernen * / stage.onMouseMove = null; bg.onPress = null; bg2.onPress = null; Ticker.removeListener (tkr); tkr = null; timerSource = null; / * Richtige Nachricht anzeigen * / if (e == 'win') win = new Bitmap (winImg); win.x = centerX - 64; win.y = centerY - 23; stage.addChild (win); stage.removeChild (Feinde, Boss);  else lose = neues Bitmap (loseImg); lose.x = centerX - 64; verlieren.y = centerY - 23; stage.addChild (verlieren); stage.removeChild (Feinde, Schiff);  bg.onPress = function () window.location.reload ();; bg2.onPress = function () window.location.reload ();; stage.update (); 

Schritt 41: Test



Speichern Sie Ihre Arbeit (falls nicht) und öffnen Sie die HTML-Datei im Browser, damit Ihr HTML5-Spiel funktioniert!


Fazit

Sie haben gelernt, wie man ein Weltraum-Shooter-Spiel mit all seinen grundlegenden Funktionen erstellt. Versuchen Sie, es mit dem zu erweitern, was Sie bereits kennen. Ein guter Anfang wäre, die Feinde oder den Boss auf den Spieler zurückschießen zu lassen.

Ich hoffe, Ihnen hat dieses Tutorial gefallen, vielen Dank für das Lesen!