Erstellen Sie mit EaselJS ein Whack-a-Mole-Spiel in HTML5
() translation by (you can also view the original English article)
Vor einigen Wochen habe ich Ihnen gezeigt, wie Sie mit Flash und AS3 ein Whack-a-Mole-Spiel (also Whack-a-Worm) erstellen. Nach meiner Einführung in EaselJS werden wir nun sehen, wie diese Bibliothek verwendet wird, um dasselbe Spiel mit der HTML5-Zeichenfläche und JavaScript zu erstellen.
Schritt 1: Kurze Übersicht
Mit vorgefertigten Grafiken werden wir das unterhaltsame Spiel Whack A Mole, ähnlich dem HTML5-Spiel, mithilfe der EaselJS-Bibliothek codieren.
Der Spieler kann auf die Würmer auf dem Bildschirm klicken und Punkte erhalten.
Schritt 2: Interface
Wir werden eine einfache und benutzerfreundliche Oberfläche verwenden, die mehrere Formen, Schaltflächen, Bitmaps und mehr hat. Verwendete Wurmgrafik werden wir von hier unter einer Creative Commons-Lizenz herunterladen.
Sie finden für dieses Tutorial erforderlichen grafischen Ressourcen für die Benutzeroberfläche im angehängten Download.
Schritt 3: Holen Sie sich EaselJS
Die EaselJS-Bibliothek wird zum Erstellen unseres Spiels verwendet. Lesen Sie unbedingt das Tutorial der Ersten Schritten, 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.
1 |
|
2 |
<!DOCTYPE html>
|
3 |
<html>
|
4 |
<head>
|
5 |
<title>Whack A Worm</title> |
6 |
</head>
|
7 |
<body>
|
8 |
</body>
|
9 |
</html>
|
Schritt 5: Mobile Hightlight ausblenden
Fügen wir auch ein wenig CSS hinzu. In dieser Zeile wird die Standardhervorhebung entfernt, wenn Sie mit einem mobilen Browser auf ein Element tippen. Ohne das würde das mobile Erlebnis drastisch abnehmen.
1 |
|
2 |
<!DOCTYPE html>
|
3 |
<html>
|
4 |
<head>
|
5 |
<title>Whack A Worm</title> |
6 |
|
7 |
<style>*{-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}</style> |
8 |
|
9 |
</head>
|
10 |
<body>
|
11 |
</body>
|
12 |
</html>
|
Schritt 6: JavaScript-Bibliotheken
Der folgende Code fügt die erforderlichen JavaScript-Bibliotheken hinzu, damit unsere App funktioniert.
1 |
|
2 |
<!DOCTYPE html>
|
3 |
<html>
|
4 |
<head>
|
5 |
<title>Whack A Worm</title> |
6 |
|
7 |
<style>*{-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}</style> |
8 |
|
9 |
<script src="easel.js"></script> |
10 |
<script src="Tween.js"></script> |
11 |
<script src="WhackAWorm.js"></script> |
12 |
</head>
|
13 |
<body>
|
14 |
</body>
|
15 |
</html>
|
Schritt 7: Hauptfunktion aufrufen
In den nächsten Zeilen rufen wir unseren Konstruktor auf. Dies ist die Hauptfunktion, die später in unserem JavaScript-Code erstellt wird.
1 |
|
2 |
<!DOCTYPE html>
|
3 |
<html>
|
4 |
<head>
|
5 |
<title>Whack A Worm</title> |
6 |
|
7 |
<style>*{-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}</style> |
8 |
|
9 |
<script src="easel.js"></script> |
10 |
<script src="Tween.js"></script> |
11 |
<script src="WhackAWorm.js"></script> |
12 |
|
13 |
</head>
|
14 |
<body onload="Main();"> |
15 |
</body>
|
16 |
</html>
|
Schritt 8: Canvas Tag
Die Leinwand wird in dieser Zeile hinzugefügt. Wir weisen eine ID zu, um später darauf zu verweisen, und legen auch deren Breite und Höhe fest.
1 |
|
2 |
<!DOCTYPE html>
|
3 |
<html>
|
4 |
<head>
|
5 |
<title>Whack A Worm</title> |
6 |
|
7 |
<style>*{-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}</style> |
8 |
|
9 |
<script src="easel.js"></script> |
10 |
<script src="Tween.js"></script> |
11 |
<script src="WhackAWorm.js"></script> |
12 |
|
13 |
</head>
|
14 |
<body onload="Main();"> |
15 |
<canvas id="WhackAWorm" width="480" height="320"></canvas> |
16 |
</body>
|
17 |
</html>
|
Schritt 9: JavaScript
Beginnen wir mit der App-Erstellung!
Öffnen Sie Ihren bevorzugten JavaScript-Editor (jeder Texteditor funktioniert, aber Sie haben keine Syntaxhervorhebung) und bereiten Sie sich darauf vor, Ihre fantastische App zu schreiben. Denken Sie daran, die Datei mit der Erweiterung .js
in Ihrem Projektordner zu speichern.
Schritt 10: Leinwand definieren
Zunächst definieren wir alle grafischen und logischen Variablen.
Die nächsten Variablen repräsentieren das HTML-Canvas-Element und die Bühne, die damit verknüpft wird. Die Stufenvariable verhält sich ähnlich wie die AS3-Stufe.
1 |
|
2 |
/* Define Canvas */
|
3 |
|
4 |
var canvas; |
5 |
var stage; |
Schritt 11: Hintergrund
Diese Variable speichert das Titelhintergrundbild. (Sie können das obige Bild herunterladen oder es aus der ZIP-Quelldatei des Tutorials herunterladen.)
1 |
|
2 |
/* Background */
|
3 |
|
4 |
var titleBg; |
Schritt 12: Titelansicht
Das ist die Titelansicht, die als erster interaktiver Bildschirm in unserem Spiel angezeigt wird. Diese Variablen speichern ihre Komponenten:
1 |
|
2 |
/* Title View */
|
3 |
|
4 |
var titleBgImg = new Image(); |
5 |
var titleBg; |
6 |
var playBtnImg = new Image(); |
7 |
var playBtn; |
8 |
var creditsBtnImg = new Image(); |
9 |
var creditsBtn; |
10 |
var titleView = new Container(); |
Schritt 13: Credits
In dieser Ansicht werden die Credits, das Jahr und das Copyright des Spiels angezeigt. Diese Variablen werden zum Speichern verwendet.
1 |
|
2 |
/* Credits */
|
3 |
|
4 |
var creditsViewImg = new Image(); |
5 |
var creditsView; |
Schritt 14: Hintergrund der Spielansicht
Der Hintergrund für die Spielansicht.
1 |
|
2 |
/* Game Bg */
|
3 |
|
4 |
var gameBgImg = new Image(); |
5 |
var gameBg; |
Schritt 15: Alarm
Eine Warnung wird angezeigt, wenn alle Würmer aufgetaucht sind, und zeigt das Endergebnis an, das der Spieler erreicht hat.
1 |
|
2 |
/* Alert */
|
3 |
|
4 |
var alertBgImg = new Image(); |
5 |
var alertBg; |
Schritt 16: Punktzahl
Der Bewertungswert wird von der nächsten Variablen verarbeitet.
1 |
|
2 |
/* Score */
|
3 |
|
4 |
var score; |
Schritt 17: Würmer
Die folgenden Variablen werden verwendet, um die Grafiken der Würmer zu speichern und auf den letzten sichtbaren Wurm zu verweisen.
1 |
|
2 |
/* Worms */
|
3 |
|
4 |
var wormImg = new Image(); |
5 |
var worm; |
6 |
var lastWorm; |
Schritt 18: Positionieren Sie Arrays
Arrays werden verwendet, um die Endposition der Würmer zu speichern. Dies wird verwendet, um den Wurm beim Ausführen der Pop-out-Animation an die richtige Lochposition zu bringen.
1 |
|
2 |
var wormsX = [80, 198, 338, 70, 225, 376, 142, 356]; |
3 |
var wormsY = [11, 51, 34, 110, 136, 96, 211, 186]; |
Schritt 19: Zusätzliche Variablen
Dies sind die anderen Variablen, die wir verwenden werden. Lesen Sie die Kommentare im Code, um mehr darüber zu erfahren. (Einige sind selbsterklärend.)
1 |
|
2 |
var centerX = 240; |
3 |
var centerY = 160; |
4 |
var gfxLoaded = 0; //used as a preloader |
5 |
|
6 |
var timerSource; |
7 |
var currentWorms = 0; //worms already shown |
8 |
var wormsHit = 0; |
9 |
var totalWorms = 10; //total of worms to display |
Schritt 20: Main() Funktion
Die Funktion Main()
wird als erste ausgeführt, wenn die Webseite geladen wird, da im Attribut onload
des HTML-Dokuments darauf verwiesen wird (siehe Schritt 7).
Es ruft die notwendigen Funktionen auf, um das Spiel zu starten. Überprüfen Sie diese Funktionen in den nächsten Schritten.
1 |
|
2 |
function Main() |
3 |
{
|
4 |
//code...
|
5 |
}
|
Schritt 21: Canvas verknüpfen
Dieser Code ruft die HTML-Canvas-ID ab und verknüpft sie mit der EaselJS Stage-Klasse. Dadurch verhält sich die Stage-Variable wie die Stage-Klasse in AS3.
1 |
|
2 |
/* Link Canvas */
|
3 |
|
4 |
canvas = document.getElementById('WhackAWorm'); |
5 |
stage = new Stage(canvas); |
Schritt 22: Mausereignisse aktivieren
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.
1 |
|
2 |
stage.mouseEventsEnabled = true; |
Schritt 23: Grafik laden
Dieser Code wird verwendet, um die Grafiken mithilfe einer Funktion vorzuladen, die wir später schreiben werden. Es setzt das zuvor erstellte Image-Objekt auf die PNG-Quelldatei in unserem Dokumentordner. Es wird ein Name vergeben, um zu erkennen, welches Bild geladen wird, und zuletzt wird die Funktion aufgerufen, die die geladenen Bilder enthält.
1 |
|
2 |
/* Load GFX */
|
3 |
|
4 |
titleBgImg.src = 'titleBg.png'; |
5 |
titleBgImg.name = 'titleBg'; |
6 |
titleBgImg.onload = loadGfx; |
7 |
|
8 |
gameBgImg.src = 'gameBg.png'; |
9 |
gameBgImg.name = 'gameBg'; |
10 |
gameBgImg.onload = loadGfx; |
11 |
|
12 |
playBtnImg.src = 'playBtn.png'; |
13 |
playBtnImg.name = 'playBtn'; |
14 |
playBtnImg.onload = loadGfx; |
15 |
|
16 |
creditsBtnImg.src = 'creditsBtn.png'; |
17 |
creditsBtnImg.name = 'creditsBtn'; |
18 |
creditsBtnImg.onload = loadGfx; |
19 |
|
20 |
creditsViewImg.src = 'creditsView.png'; |
21 |
creditsViewImg.name = 'credits'; |
22 |
creditsViewImg.onload = loadGfx; |
23 |
|
24 |
alertBgImg.src = 'alertBg.png'; |
25 |
alertBgImg.name = 'alertBg'; |
26 |
alertBgImg.onload = loadGfx; |
27 |
|
28 |
wormImg.src = 'worm.png'; |
29 |
wormImg.name = 'worm'; |
30 |
wormImg.onload = loadGfx; |
Schritt 24: Ticker einstellen
Das Ticker-Objekt bietet einen zentralen Tick oder Heartbeat, der in einem festgelegten Intervall über den Rückruf von tick()
gesendet wird.
Der folgende Code setzt die Bildrate auf 30 und definiert die Bühne als Listener für die Ticks.
Die TweenJS-Klasse hört sich dieses Häkchen an, um die Animationen auszuführen.
1 |
|
2 |
/* Ticker */
|
3 |
|
4 |
Ticker.setFPS(30); |
5 |
Ticker.addListener(stage); |
Schritt 25: Vorladefunktion
Jedes Mal, wenn eine Grafik geladen wird, wird diese Funktion ausgeführt. Es ordnet jedes Bild einem Bitmap-Objekt zu und prüft, ob alle Elemente geladen sind, bevor Sie fortfahren. Wie Sie sehen, werden einer Bitmap nur fünf Bilder zugewiesen, aber die Variable gfxLoaded
wartet, bis sieben Elemente geladen sind. Auf diese Weise wird darauf gewartet, dass die CreditsView- und Worms-Grafik im Speicher gespeichert wird.
1 |
|
2 |
function loadGfx(e) |
3 |
{
|
4 |
if(e.target.name = 'titleBg'){titleBg = new Bitmap(titleBgImg);} |
5 |
if(e.target.name = 'gameBg'){gameBg = new Bitmap(gameBgImg);} |
6 |
if(e.target.name = 'playBtn'){playBtn = new Bitmap(playBtnImg);} |
7 |
if(e.target.name = 'creditsBtn'){creditsBtn = new Bitmap(creditsBtnImg);} |
8 |
if(e.target.name = 'alertBg'){alertBg = new Bitmap(alertBgImg);} |
9 |
/* --CreditsView
|
10 |
--Worms */
|
11 |
|
12 |
gfxLoaded++; |
13 |
|
14 |
if(gfxLoaded == 7) |
15 |
{
|
16 |
addTitleView(); |
17 |
}
|
18 |
}
|
Schritt 26: Spielansicht hinzufügen
Wenn alle Grafiken geladen sind, wird der Spielhintergrund zur Bühne hinzugefügt. Dieser wird später in der Titelansicht behandelt. Dies soll etwas dahinter zeigen, wenn diese Ansicht zwischengeschaltet und entfernt wird.
1 |
|
2 |
function addTitleView() |
3 |
{
|
4 |
/* Add GameView BG */
|
5 |
|
6 |
stage.addChild(gameBg); |
Schritt 27: Titelansicht
Jetzt platzieren wir die TitleView in der Bühne und rufen eine Funktion auf, die die Maus-Listener zu den Schaltflächen hinzufügt.
1 |
|
2 |
/* Title Screen */
|
3 |
|
4 |
playBtn.x = centerX - 25; |
5 |
playBtn.y = centerY + 35; |
6 |
|
7 |
creditsBtn.x = centerX - 40; |
8 |
creditsBtn.y = centerY + 80; |
9 |
|
10 |
titleView.addChild(titleBg, playBtn, creditsBtn); |
11 |
|
12 |
stage.addChild(titleView); |
13 |
|
14 |
startButtonListeners('add'); |
15 |
|
16 |
stage.update(); |
17 |
}
|
Schritt 28: Starten Sie die Button Listener
Diese Funktion fügt den TitleView-Schaltflächen die erforderlichen Listener hinzu.
1 |
|
2 |
function startButtonListeners(action) |
3 |
{
|
4 |
if(action == 'add') |
5 |
{
|
6 |
titleView.getChildAt(1).onPress = showGameView; |
7 |
titleView.getChildAt(2).onPress = showCredits; |
8 |
}
|
9 |
else
|
10 |
{
|
11 |
titleView.getChildAt(1).onPress = null; |
12 |
titleView.getChildAt(2).onPress = null; |
13 |
}
|
14 |
}
|
Schritt 29: Credits anzeigen
Der Bildschirm Credits wird angezeigt, wenn der Benutzer auf die Schaltfläche Credits klickt. Dem vollständigen Bild wird ein Maus-Listener hinzugefügt, um es zu entfernen.
1 |
|
2 |
function showCredits() |
3 |
{
|
4 |
playBtn.visible = false; |
5 |
creditsBtn.visible = false; |
6 |
creditsView = new Bitmap(creditsViewImg); |
7 |
stage.addChild(creditsView); |
8 |
creditsView.x = -203; |
9 |
|
10 |
Tween.get(creditsView).to({x:0}, 200).call(function(){creditsView.onPress = hideCredits;}); |
11 |
}
|
Schritt 30: Credits ausblenden
Wenn Sie auf den Bildschirm Credits klicken, wird dieser zurückgeschaltet und von der Bühne entfernt.
1 |
|
2 |
function hideCredits() |
3 |
{
|
4 |
playBtn.visible = true; |
5 |
creditsBtn.visible = true; |
6 |
Tween.get(creditsView).to({x:-203}, 200).call(function(){creditsView.onPress = null; stage.removeChild(creditsView); creditsView = null;}); |
7 |
}
|
Meilenstein
Lassen Sie uns hier anhalten, um einen kurzen Test durchzuführen und sicherzustellen, dass unser Spielcode funktioniert.
Schauen Sie sich hier den Meilenstein an.
Beachten Sie, dass einige Zeilen kommentiert wurden, da einige Funktionen noch nicht erstellt wurden.
Denken Sie daran, dass die Meilensteine in den Quelldateien enthalten sind. Wenn Ihre Datei diese also aus irgendeinem Grund nicht nachahmt, sehen Sie sich die Quelle an, um festzustellen, was dies verursachen könnte.
Schritt 31: Spielansicht anzeigen
Die folgenden Zeilen entfernen den Titel Bildschirm und lassen den Spielbildschirm sichtbar. Es wird auch eine Funktion aufgerufen, die den ersten Wurm anzeigt.
1 |
|
2 |
function showGameView() |
3 |
{
|
4 |
Tween.get(titleView).to({x: -480}, 200).call( |
5 |
function(){ |
6 |
startButtonListeners('rmv'); |
7 |
stage.removeChild(titleView); |
8 |
titleView = null; |
9 |
showWorm(); |
10 |
}
|
11 |
);
|
12 |
}
|
Schritt 32: Partiturtext
Dieser Code erstellt das Textobjekt, das die Partitur anzeigt.
1 |
|
2 |
score = new Text('0' + '/' + totalWorms, 'bold 15px Arial', '#EEE'); |
3 |
score.maxWidth = 1000; //fix for Chrome 17 |
4 |
score.x = 58; |
5 |
score.y = 21; |
6 |
stage.addChild(score); |
Schritt 33: Überprüfen Sie, ob das Spiel beendet ist
Dieser Code prüft, ob die angezeigten Würmer das Limit überschritten haben, und ruft eine Warnung auf, wenn dies der Alert ist.
1 |
|
2 |
function showWorm() |
3 |
{
|
4 |
if(currentWorms == totalWorms) |
5 |
{
|
6 |
showAlert(); |
7 |
}
|
Schritt 34: Entfernen Sie den letzten Wurm
Dieser Code prüft, ob ein Wurm hinzugefügt wurde, und entfernt ihn gegebenenfalls.
1 |
|
2 |
else
|
3 |
{
|
4 |
if(lastWorm != null) |
5 |
{
|
6 |
lastWorm.onPress = null; |
7 |
stage.removeChild(lastWorm); |
8 |
stage.update(); |
9 |
lastWorm = null; |
10 |
}
|
Schritt 35: Zufälligen Wurm berechnen
Die nächste Zeile berechnet eine Zufallszahl, die im positions
array verwendet wird, um einen Wurm in ein zufälliges Loch zu platzieren.
1 |
|
2 |
var randomPos = Math.floor(Math.random() * 8); |
Schritt 36: Den Wurm hinzufügen
Jetzt erschaffen wir den Wurm und platzieren ihn; ein Maus-Listener wird hinzugefügt, um die Player-Klicks zu verarbeiten.
1 |
|
2 |
var worm = new Bitmap(wormImg); |
3 |
|
4 |
worm.x = wormsX[randomPos]; |
5 |
worm.y = wormsY[randomPos]; |
6 |
stage.addChild(worm); |
7 |
worm.onPress = wormHit; |
8 |
|
9 |
lastWorm = worm; |
Schritt 37: Animation
Eine kleine Animation wird angezeigt, wenn der Wurm herauskommt: ein kleines Tween zu seiner Eigenschaft scaleY. Wenn die Animation beendet ist, erhöht sich die Variable currentWorms
und die Funktion showWorm()
wird erneut aufgerufen. Dadurch wird eine Schleife erstellt, die endet, sobald die Variable currentWorms
den Wert von totalWorms
erreicht.
1 |
|
2 |
lastWorm.scaleY = 0.3; |
3 |
lastWorm.y += 42; |
4 |
stage.update(); |
5 |
|
6 |
Tween.get(lastWorm).to({scaleY: 1, y: wormsY[randomPos]}, 200).wait(1000).call(function(){currentWorms++; showWorm()}); |
Schritt 38: Wurm treffen
Diese Funktion behandelt das Klicken eines Wurms. Es erhöht im Grunde die Punktzahl und zerstört den angeklickten Wurm.
1 |
|
2 |
function wormHit() |
3 |
{
|
4 |
wormsHit++; |
5 |
score.text = wormsHit + '/' + totalWorms; |
6 |
|
7 |
lastWorm.onPress = null; |
8 |
stage.removeChild(lastWorm); |
9 |
lastWorm = null; |
10 |
stage.update(); |
11 |
}
|
Schritt 39: Warnung anzeigen
Diese Funktion stoppt das Spiel und zeigt das Endergebnis an, wobei der Alarmhintergrund angezeigt und zwischengeschaltet wird.
1 |
|
2 |
function showAlert() |
3 |
{
|
4 |
alertBg.x = centerX - 120; |
5 |
alertBg.y = -80; |
6 |
stage.addChild(alertBg); |
7 |
|
8 |
Tween.get(alertBg).to({y:centerY - 80}, 200).call(function() |
9 |
{
|
10 |
Ticker.removeAllListeners(); |
11 |
var score = new Text(wormsHit + '/' + totalWorms, 'bold 20px Arial', '#EEE'); |
12 |
score.maxWidth = 1000; //fix for Chrome 17 |
13 |
score.x = 220; |
14 |
score.y = 205; |
15 |
stage.addChild(score); |
16 |
stage.update(); |
17 |
});
|
18 |
}
|
Schritt 40: Testen
Speichern Sie Ihre Arbeit (falls nicht) und öffnen Sie die HTML-Datei im Browser, um zu sehen, wir Ihr HTML5-Spiel funktioniert!
Abschluss
Wie Sie sehen können, können viele der Spielvariablen/-parameter geändert und an Ihre Bedürfnisse angepasst werden. Versuchen Sie also, Ihre eigene Version des Spiels zu erstellen!
Ich hoffe Ihnen hat dieses Tutorial gefallen, danke für das Lesen!