Lernen Sie CreateJS, indem Sie ein HTML5-Pong-Spiel erstellen
() translation by (you can also view the original English article)
Das Web bewegt sich schnell - so schnell, dass unser ursprüngliches EaselJS-Tutorial bereits veraltet ist! In diesem Tutorial erfahren Sie, wie Sie die neueste CreateJS-Suite verwenden, indem Sie einen einfachen Pong-Klon erstellen.
Endergebnis Vorschau
Werfen wir einen Blick auf das Endergebnis, auf das wir hinarbeiten werden:
Dieses Tutorial basiert auf Carlos Yanez Create a Pong-Spiel in HTML5 mit EaselJS, das wiederum auf seinem Handbuch Erste Schritte mit EaselJS basiert. Die Grafiken und Soundeffekte stammen alle aus dem vorherigen Tutorial.
Schritt 1: Erstellen Sie index.html
Dies wird unsere Hauptdatei index.html
sein:
1 |
<!DOCTYPE html> |
2 |
<html> |
3 |
<head> |
4 |
<title>Pong</title> |
5 |
|
6 |
<style>/* Removes Mobile Highlight */ *{-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}</style> |
7 |
|
8 |
<script src="http://code.createjs.com/easeljs-0.4.2.min.js"></script> |
9 |
<script src="http://code.createjs.com/tweenjs-0.2.0.min.js"></script> |
10 |
<script src="http://code.createjs.com/soundjs-0.2.0.min.js"></script> |
11 |
<script src="http://code.createjs.com/preloadjs-0.1.0.min.js"></script> |
12 |
<script src="http://code.createjs.com/movieclip-0.4.1.min.js"></script> |
13 |
<script src="assets/soundjs.flashplugin-0.2.0.min.js"></script> |
14 |
<script src="Main.js"></script> |
15 |
|
16 |
</head> |
17 |
<body onload="Main();"> |
18 |
<canvas id="PongStage" width="480" height="320"></canvas> |
19 |
</body> |
20 |
</html> |
Wie Sie sehen, ist es ziemlich kurz und besteht hauptsächlich aus dem Laden der CreateJS-Bibliotheken.
Seit der Veröffentlichung von CreateJS (das im Grunde alle separaten EaselJS-Bibliotheken bündelt) müssen wir die JS-Dateien nicht mehr herunterladen und auf unserer Website hosten. Die Dateien werden jetzt in einem CDN (Content Delivery Network) abgelegt, mit dem wir diese Dateien so schnell wie möglich aus der Ferne laden können.
Überprüfen wir den Code:
1 |
<style>/* Removes Mobile Highlight */ *{-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}</style> |
Diese Zeile entfernt die mobile Hervorhebung, die möglicherweise angezeigt wird, wenn Sie versuchen, das Spiel auf dem Handy zu spielen. (Durch die mobile Hervorhebung wird das Canvas-Objekt hervorgehoben und Ihre Fingerbewegungen werden ignoriert.)
Als nächstes müssen ie CreateJS-Bibliotheken geladen werden:>
1 |
<script src="http://code.createjs.com/easeljs-0.4.2.min.js"></script> |
2 |
<script src="http://code.createjs.com/tweenjs-0.2.0.min.js"></script> |
3 |
<script src="http://code.createjs.com/soundjs-0.2.0.min.js"></script> |
4 |
<script src="http://code.createjs.com/preloadjs-0.1.0.min.js"></script> |
5 |
<script src="http://code.createjs.com/movieclip-0.4.1.min.js"></script> |
Dieser Code lädt die JS-Dateien vom CreateJS-CDN und ermöglicht es uns grundsätzlich, alle CreateJS-Funktionen in unserem Code zu verwenden
Als Nächstes laden wir das SoundJS Flash-Plugin, das Soundunterstützung für Browser bietet, die HTML5 Audio nicht unterstützen. Ihnen hilft SWF (eines Flash-Objekts) zum Laden der Sounds.
1 |
<script src="assets/soundjs.flashplugin-0.2.0.min.js"></script> |
In diesem Fall verwenden wir das CDN nicht. Stattdessen laden wir die SoundJS-Bibliothek von http://createjs.com/#!/SoundJS/download herunter und platzieren die Dateien soundjs.flashplugin-0.2.0.min.js
und FlashAudioPlugin.swf
in einem lokalen Ordner mit dem Namen assets
.
Als letzte der JS-Dateien laden wir die Datei Main.js
, die den gesamten Code für unser Spiel enthält:
1 |
<script src="Main.js"></script> |
Zum Schluss platzieren wir ein Canvas-Objekt auf unserer Bühne.
1 |
<body onload="Main();"> |
2 |
<canvas id="PongStage" width="480" height="320"></canvas> |
3 |
</body> |
Jetzt können wir mit der Arbeit am Spielcode beginnen.
Schritt 2: Die Variablen
Unser Spielcode befindet sich in einer Datei namens Main.js
. Erstellen und speichern Sie diese jetzt.
Definieren wir Variablen für alle Grafikobjekte im Spiel:
1 |
var canvas; //Will be linked to the canvas in our index.html page |
2 |
var stage; //Is the equivalent of stage in AS3; we'll add "children" to it |
3 |
|
4 |
// Graphics
|
5 |
//[Background]
|
6 |
|
7 |
var bg; //The background graphic |
8 |
|
9 |
//[Title View]
|
10 |
|
11 |
|
12 |
var main; //The Main Background |
13 |
var startB; //The Start button in the main menu |
14 |
var creditsB; //The credits button in the main menu |
15 |
|
16 |
//[Credits]
|
17 |
|
18 |
|
19 |
var credits; //The Credits screen |
20 |
|
21 |
//[Game View]
|
22 |
|
23 |
|
24 |
var player; //The player paddle graphic |
25 |
var ball; //The ball graphic |
26 |
var cpu; //The CPU paddle |
27 |
var win; //The winning popup |
28 |
var lose; //The losing popup |
Ich habe für jede Variable einen Kommentar hinzugefügt, damit Sie wissen, was wir in diese Variable laden
Weiter bekommen Sie nächste:
1 |
//[Score]
|
2 |
|
3 |
var playerScore; //The main player score |
4 |
var cpuScore; //The CPU score |
5 |
var cpuSpeed=6; //The speed of the CPU paddle; the faster it is the harder the game is |
Wir benötigen Variablen für die Geschwindigkeit des Balls:
1 |
// Variables
|
2 |
|
3 |
var xSpeed = 5; |
4 |
var ySpeed = 5; |
Sie können diese Werte beliebig ändern, wenn Sie das Spiel einfacher oder schwieriger machen möchten.
Wenn Sie ein Flash-Entwickler sind, wissen Sie, dass der onEnterFrame
von Flash beim Erstellen von Spielen sehr nützlich ist, da in jedem Frame Dinge passieren müssen. (Wenn Sie mit dieser Idee nicht vertraut sind, lesen Sie diesen Artikel in der Game Loop.)
Wir haben ein Äquivalent für onEnterFrame
in CreateJS, und das ist das ticker
-Objekt, das Code im Bruchteil einer Sekunde ausführen kann. Erstellen wir die Variable, die mit ihr verknüpft wird:
1 |
var tkr = new Object; |
Danach haben wir den Preloader, der die neuen PreloadJS-Methoden verwenden wird.
1 |
//preloader
|
2 |
var preloader; |
3 |
var manifest; |
4 |
var totalLoaded = 0; |
-
preloader
- enthält das PreloadJS-Objekt. -
manifest
- enthält die Liste der Dateien, die geladen werden müssen. -
totalLoaded
- Diese Variable enthält die Anzahl der bereits geladenen Dateien.
Last but not least haben wir in unserer Liste der Variablen TitleView
, das mehrere Grafiken enthält, um sie zusammen anzuzeigen (wie ein Flash DisplayObjectContainer
).
1 |
var TitleView = new Container(); |
Fahren wir mit der Hauptfunktion fort...
Schritt 3: Die Main() Funktion
Diese Funktion ist die erste Funktion, die ausgeführt wird, nachdem alle JS-Dateien aus der index.html
geladen wurden. Aber wie heißt diese Funktion?
Erinnern Sie sich an diese Zeile aus der Datei index.html
?
1 |
<body onload="Main();"> |
Dieses Codefragment besagt, dass nach dem Laden des HTML (und der JS-Bibliotheken) die Main
funktion ausgeführt werden sollte.
Lassen Sie es uns überprüfen:
1 |
function Main() |
2 |
{
|
3 |
/* Link Canvas */
|
4 |
|
5 |
canvas = document.getElementById('PongStage'); |
6 |
stage = new Stage(canvas); |
7 |
|
8 |
stage.mouseEventsEnabled = true; |
9 |
|
10 |
|
11 |
/* Set The Flash Plugin for browsers that don't support SoundJS */
|
12 |
SoundJS.FlashPlugin.BASE_PATH = "assets/"; |
13 |
if (!SoundJS.checkPlugin(true)) { |
14 |
alert("Error!"); |
15 |
return; |
16 |
}
|
17 |
|
18 |
manifest = [ |
19 |
{src:"bg.png", id:"bg"}, |
20 |
{src:"main.png", id:"main"}, |
21 |
{src:"startB.png", id:"startB"}, |
22 |
{src:"creditsB.png", id:"creditsB"}, |
23 |
{src:"credits.png", id:"credits"}, |
24 |
{src:"paddle.png", id:"cpu"}, |
25 |
{src:"paddle.png", id:"player"}, |
26 |
{src:"ball.png", id:"ball"}, |
27 |
{src:"win.png", id:"win"}, |
28 |
{src:"lose.png", id:"lose"}, |
29 |
{src:"playerScore.mp3|playerScore.ogg", id:"playerScore"}, |
30 |
{src:"enemyScore.mp3|enemyScore.ogg", id:"enemyScore"}, |
31 |
{src:"hit.mp3|hit.ogg", id:"hit"}, |
32 |
{src:"wall.mp3|wall.ogg", id:"wall"} |
33 |
];
|
34 |
|
35 |
|
36 |
|
37 |
preloader = new PreloadJS(); |
38 |
preloader.installPlugin(SoundJS); |
39 |
preloader.onProgress = handleProgress; |
40 |
preloader.onComplete = handleComplete; |
41 |
preloader.onFileLoad = handleFileLoad; |
42 |
preloader.loadManifest(manifest); |
43 |
|
44 |
/* Ticker */
|
45 |
|
46 |
Ticker.setFPS(30); |
47 |
Ticker.addListener(stage); |
48 |
}
|
Lassen Sie uns jeden Teil aufschlüsseln:
1 |
canvas = document.getElementById('PongStage'); |
2 |
stage = new Stage(canvas); |
3 |
|
4 |
stage.mouseEventsEnabled = true; |
Hier verknüpfen wir das PongStage
Canvas-Objekt aus der Datei index.html
mit der Canvas-Variablen und erstellen dann ein Stage-Objekt aus diesem Canvas. (Auf der Bühne können wir Objekte darauf platzieren.)
Mit mouseEventsEnabled
können wir Mausereignisse verwenden, um Mausbewegunge und -klicks zu erkennen.
1 |
/* Set The Flash Plugin for browsers that don't support SoundJS */
|
2 |
SoundJS.FlashPlugin.BASE_PATH = "assets/"; |
3 |
if (!SoundJS.checkPlugin(true)) { |
4 |
alert("Error!"); |
5 |
return; |
6 |
}
|
Hier konfigurieren wir, wo sich das Flash-Sound-Plugin für die Browser befindet, in denen HTML5 Audio nicht unterstützt wird
1 |
manifest = [ |
2 |
{src:"bg.png", id:"bg"}, |
3 |
{src:"main.png", id:"main"}, |
4 |
{src:"startB.png", id:"startB"}, |
5 |
{src:"creditsB.png", id:"creditsB"}, |
6 |
{src:"credits.png", id:"credits"}, |
7 |
{src:"paddle.png", id:"cpu"}, |
8 |
{src:"paddle.png", id:"player"}, |
9 |
{src:"ball.png", id:"ball"}, |
10 |
{src:"win.png", id:"win"}, |
11 |
{src:"lose.png", id:"lose"}, |
12 |
{src:"playerScore.mp3|playerScore.ogg", id:"playerScore"}, |
13 |
{src:"enemyScore.mp3|enemyScore.ogg", id:"enemyScore"}, |
14 |
{src:"hit.mp3|hit.ogg", id:"hit"}, |
15 |
{src:"wall.mp3|wall.ogg", id:"wall"} |
16 |
];
|
In der Manifestvariablen platzieren wir ein Array von Dateien, die wir laden möchten (und geben für jede eine eindeutige ID an). Jeder Sound hat zwei Formate - MP3 und OGG - da verschiedene Browser mit verschiedenen Formaten (in) kompatibel sind.
1 |
preloader = new PreloadJS(); |
2 |
preloader.installPlugin(SoundJS); |
3 |
preloader.onProgress = handleProgress; |
4 |
preloader.onComplete = handleComplete; |
5 |
preloader.onFileLoad = handleFileLoad; |
6 |
preloader.loadManifest(manifest); |
Hier konfigurieren wir das Preloader-Objekt mit PreloadJS. PreloadJS ist eine neue Ergänzung zu den CreateJS-Bibliotheken und eine recht nützliche.
Wir erstellen ein neues PreloadJS-Objekt, platzieren es in der preloader
-Variablen und weisen dann jedem Ereignis eine Methode zu (onProgress
, onComplete
, onFileLoad
). Schließlich verwenden wir den preloader
, um das zuvor erstellte Manifest zu laden.
1 |
Ticker.setFPS(30); |
2 |
Ticker.addListener(stage); |
Hier fügen wir das Ticker-Objekt zur Bühne hinzu und stellen die Bildrate auf 30 FPS ein. Wir werden es später im Spiel für die enterFrame
-Funktionalität verwenden.
Schritt 4: Erstellen der Preloader-Funktionen
1 |
function handleProgress(event) |
2 |
{
|
3 |
//use event.loaded to get the percentage of the loading
|
4 |
}
|
5 |
|
6 |
function handleComplete(event) { |
7 |
//triggered when all loading is complete
|
8 |
}
|
9 |
|
10 |
function handleFileLoad(event) { |
11 |
//triggered when an individual file completes loading
|
12 |
|
13 |
switch(event.type) |
14 |
{
|
15 |
case PreloadJS.IMAGE: |
16 |
//image loaded
|
17 |
var img = new Image(); |
18 |
img.src = event.src; |
19 |
img.onload = handleLoadComplete; |
20 |
window[event.id] = new Bitmap(img); |
21 |
break; |
22 |
|
23 |
case PreloadJS.SOUND: |
24 |
//sound loaded
|
25 |
handleLoadComplete(); |
26 |
break; |
27 |
}
|
28 |
}
|
Sehen wir uns die Funktionen an:
-
handleProgress
- In dieser Funktion können Sie den Prozentsatz des Ladevorgangs mithilfe des folgenden Parameters verfolgen:event.loaded
. Damit können Sie beispielsweise einen Fortschrittsbalken erstellen. -
handleComplete
- Diese Funktion wird aufgerufen, sobald alle Dateien geladen wurden (falls Sie dort etwas platzieren möchten). -
handleFileLoad
- Da wir zwei Arten von Dateien laden - Bilder und Töne - haben wir diese Funktion, die jede einzeln behandelt. Wenn es sich um ein Bild handelt, erstellen wir ein Bitmap-Bild, platzieren es in einer Variablen (deren Name mit der ID des geladenen Bildes übereinstimmt) und rufen dann die FunktionhandleLoadComplete
auf (die wir als Nächstes schreiben). Wenn es sich um einen Sound handelt, rufen wir soforthandleLoadComplete
auf.
Lassen Sie uns nun die soeben erwähnte handleLoadComplete
-Funktion diskutieren:
1 |
function handleLoadComplete(event) |
2 |
{
|
3 |
|
4 |
totalLoaded++; |
5 |
|
6 |
if(manifest.length==totalLoaded) |
7 |
{
|
8 |
addTitleView(); |
9 |
}
|
10 |
}
|
Es ist eine ziemlich einfache Funktion. Wir erhöhen die Variable totalLoaded
(die die Anzahl der bisher geladenen Assets enthält) und prüfen dann, ob die Anzahl der Elemente in unserem Manifest mit der Anzahl der geladenen Assets übereinstimmt. In diesem Fall wechseln wir zum Hauptmenü.
Schritt 5: Erstellen des Hauptmenüs



1 |
function addTitleView() |
2 |
{
|
3 |
//console.log("Add Title View");
|
4 |
startB.x = 240 - 31.5; |
5 |
startB.y = 160; |
6 |
startB.name = 'startB'; |
7 |
|
8 |
creditsB.x = 241 - 42; |
9 |
creditsB.y = 200; |
10 |
|
11 |
TitleView.addChild(main, startB, creditsB); |
12 |
stage.addChild(bg, TitleView); |
13 |
stage.update(); |
14 |
|
15 |
// Button Listeners
|
16 |
|
17 |
startB.onPress = tweenTitleView; |
18 |
creditsB.onPress = showCredits; |
Hier ist nichts Besonderes. Wir platzieren die Bilder der Hintergrund-, Start- und Credits-Schaltfläche auf der Bühne und verknüpfen die onPress
-Ereignishandler mit den Start- und Credits-Schaltflächen.
Hier sind die Funktionen, mit denen der Credits-Bildschirm und das tweenTitleView
, mit dem das Spiel gestartet wird, angezeigt und entfernt werden:
1 |
function showCredits() |
2 |
{
|
3 |
// Show Credits
|
4 |
|
5 |
credits.x = 480; |
6 |
|
7 |
stage.addChild(credits); |
8 |
stage.update(); |
9 |
Tween.get(credits).to({x:0}, 300); |
10 |
credits.onPress = hideCredits; |
11 |
}
|
12 |
|
13 |
// Hide Credits
|
14 |
|
15 |
function hideCredits(e) |
16 |
{
|
17 |
Tween.get(credits).to({x:480}, 300).call(rmvCredits); |
18 |
}
|
19 |
|
20 |
// Remove Credits
|
21 |
|
22 |
function rmvCredits() |
23 |
{
|
24 |
stage.removeChild(credits); |
25 |
}
|
26 |
|
27 |
// Tween Title View
|
28 |
|
29 |
function tweenTitleView() |
30 |
{
|
31 |
// Start Game
|
32 |
|
33 |
Tween.get(TitleView).to({y:-320}, 300).call(addGameView); |
34 |
}
|
Schritt 6: Der Spielcode



Wir haben den Hauptteil dieses Tutorials erreicht, nämlich den Code des Spiels.
Zunächst müssen wir der Bühne alle erforderlichen Assets hinzufügen, also tun wir dies in der Funktion addGameView
:
1 |
function addGameView() |
2 |
{
|
3 |
// Destroy Menu & Credits screen
|
4 |
|
5 |
stage.removeChild(TitleView); |
6 |
TitleView = null; |
7 |
credits = null; |
8 |
|
9 |
// Add Game View
|
10 |
|
11 |
player.x = 2; |
12 |
player.y = 160 - 37.5; |
13 |
cpu.x = 480 - 25; |
14 |
cpu.y = 160 - 37.5; |
15 |
ball.x = 240 - 15; |
16 |
ball.y = 160 - 15; |
17 |
|
18 |
// Score
|
19 |
|
20 |
playerScore = new Text('0', 'bold 20px Arial', '#A3FF24'); |
21 |
playerScore.x = 211; |
22 |
playerScore.y = 20; |
23 |
|
24 |
cpuScore = new Text('0', 'bold 20px Arial', '#A3FF24'); |
25 |
cpuScore.x = 262; |
26 |
cpuScore.y = 20; |
27 |
|
28 |
stage.addChild(playerScore, cpuScore, player, cpu, ball); |
29 |
stage.update(); |
30 |
|
31 |
// Start Listener
|
32 |
|
33 |
bg.onPress = startGame; |
34 |
}
|
Wieder eine ziemlich einfache Funktion, die die Objekte auf dem Bildschirm platziert und dem Hintergrundbild ein mouseEvent hinzufügt, so dass das Spiel startet, wenn der Benutzer darauf klickt (wir rufen die Funktion startGame
auf).
Sehen wir uns die startGame
-Funktion an:
1 |
function startGame(e) |
2 |
{
|
3 |
bg.onPress = null; |
4 |
stage.onMouseMove = movePaddle; |
5 |
|
6 |
Ticker.addListener(tkr, false); |
7 |
tkr.tick = update; |
8 |
}
|
Hier, wie Sie sehen können, zusätzlich zum Hinzufügen eines onMouseMove
-Ereignisses, das unser Paddel bewegt. Wir fügen das tick
-Ereignis hinzu, das die update
funktion in jedem Frame aufruft.
Sehen wir uns die Funktionen movePaddle
und reset
an:
1 |
function movePaddle(e) |
2 |
{
|
3 |
// Mouse Movement
|
4 |
player.y = e.stageY; |
5 |
}
|
6 |
|
7 |
/* Reset */
|
8 |
|
9 |
function reset() |
10 |
{
|
11 |
ball.x = 240 - 15; |
12 |
ball.y = 160 - 15; |
13 |
player.y = 160 - 37.5; |
14 |
cpu.y = 160 - 37.5; |
15 |
|
16 |
stage.onMouseMove = null; |
17 |
Ticker.removeListener(tkr); |
18 |
bg.onPress = startGame; |
19 |
}
|
In movePaddle
platzieren wir das Paddel des Benutzers grundsätzlich an der y-Koordinate der Maus.
Beim reset
machen wir etwas Ähnliches wie addGameView
, außer dass wir hier keine grafischen Elemente hinzufügen, da sie bereits auf dem Bildschirm angezeigt werden.
Mit der alert
funktion zeigen wir das Gewinn- und Verlust-Popup an:
1 |
function alert(e) |
2 |
{
|
3 |
Ticker.removeListener(tkr); |
4 |
stage.onMouseMove = null; |
5 |
bg.onPress = null |
6 |
|
7 |
if(e == 'win') |
8 |
{
|
9 |
win.x = 140; |
10 |
win.y = -90; |
11 |
|
12 |
stage.addChild(win); |
13 |
Tween.get(win).to({y: 115}, 300); |
14 |
}
|
15 |
else
|
16 |
{
|
17 |
lose.x = 140; |
18 |
lose.y = -90; |
19 |
|
20 |
stage.addChild(lose); |
21 |
Tween.get(lose).to({y: 115}, 300); |
22 |
}
|
23 |
}
|
Schritt 7: Die Spielschleife
Im letzten Teil unseres Tutorials arbeiten wir nun an der update
-Funktion (die in jedem Frame des Spiels auftritt - ähnlich wie bei Flashs onEnterFrame
):
1 |
function update() |
2 |
{
|
3 |
// Ball Movement
|
4 |
|
5 |
ball.x = ball.x + xSpeed; |
6 |
ball.y = ball.y + ySpeed; |
7 |
|
8 |
// Cpu Movement
|
9 |
|
10 |
if(cpu.y < ball.y) { |
11 |
cpu.y = cpu.y + 4; |
12 |
}
|
13 |
else if(cpu.y > ball.y) { |
14 |
cpu.y = cpu.y - 4; |
15 |
}
|
16 |
|
17 |
// Wall Collision
|
18 |
|
19 |
if((ball.y) < 0) { ySpeed = -ySpeed; SoundJS.play('wall'); };//Up |
20 |
if((ball.y + (30)) > 320) { ySpeed = -ySpeed; SoundJS.play('wall');};//down |
21 |
|
22 |
/* CPU Score */
|
23 |
|
24 |
if((ball.x) < 0) |
25 |
{
|
26 |
xSpeed = -xSpeed; |
27 |
cpuScore.text = parseInt(cpuScore.text + 1); |
28 |
reset(); |
29 |
SoundJS.play('enemyScore'); |
30 |
}
|
31 |
|
32 |
/* Player Score */
|
33 |
|
34 |
if((ball.x + (30)) > 480) |
35 |
{
|
36 |
xSpeed = -xSpeed; |
37 |
playerScore.text = parseInt(playerScore.text + 1); |
38 |
reset(); |
39 |
SoundJS.play('playerScore'); |
40 |
}
|
41 |
|
42 |
/* Cpu collision */
|
43 |
|
44 |
if(ball.x + 30 > cpu.x && ball.x + 30 < cpu.x + 22 && ball.y >= cpu.y && ball.y < cpu.y + 75) |
45 |
{
|
46 |
xSpeed *= -1; |
47 |
SoundJS.play('hit'); |
48 |
}
|
49 |
|
50 |
/* Player collision */
|
51 |
|
52 |
if(ball.x <= player.x + 22 && ball.x > player.x && ball.y >= player.y && ball.y < player.y + 75) |
53 |
{
|
54 |
xSpeed *= -1; |
55 |
SoundJS.play('hit'); |
56 |
}
|
57 |
|
58 |
/* Stop Paddle from going out of canvas */
|
59 |
|
60 |
if(player.y >= 249) |
61 |
{
|
62 |
player.y = 249; |
63 |
}
|
64 |
|
65 |
/* Check for Win */
|
66 |
|
67 |
if(playerScore.text == '10') |
68 |
{
|
69 |
alert('win'); |
70 |
}
|
71 |
|
72 |
/* Check for Game Over */
|
73 |
|
74 |
if(cpuScore.text == '10') |
75 |
{
|
76 |
alert('lose'); |
77 |
}
|
78 |
}
|
Sieht beängstigend aus, oder? Keine Sorge, wir werden jeden Teil überprüfen und darüber diskutieren.
1 |
// Ball Movement
|
2 |
|
3 |
ball.x = ball.x + xSpeed; |
4 |
ball.y = ball.y + ySpeed; |
In jedem Frame bewegt sich der Ball gemäß seinen x- und y-Geschwindigkeitswerten
1 |
// Cpu Movement
|
2 |
|
3 |
if((cpu.y+32) < (ball.y-14)) { |
4 |
cpu.y = cpu.y + cpuSpeed; |
5 |
}
|
6 |
else if((cpu.y+32) > (ball.y+14)) { |
7 |
cpu.y = cpu.y - cpuSpeed; |
8 |
}
|
Hier haben wir die grundlegende KI des Computers, bei der das Paddel des Computers einfach dem Ball ohne spezielle Logik folgt. Wir vergleichen einfach die Position der Mitte des Paddels (weshalb wir dem CPU-Y-Wert 32 Pixel hinzufügen) mit der Position des Balls mit einem kleinen Versatz und bewegen das Paddel nach Bedarf nach oben oder unten.
1 |
if((ball.y) < 0) { //top |
2 |
ySpeed = -ySpeed; |
3 |
SoundJS.play('wall'); |
4 |
};
|
5 |
if((ball.y + (30)) > 320) { //bottom |
6 |
ySpeed = -ySpeed; |
7 |
SoundJS.play('wall'); |
8 |
};
|
Wenn der Ball den oberen oder unteren Rand des Bildschirms trifft, ändert der Ball die Richtung und wir spielen den Wall Hit-Sound.
1 |
/* CPU Score */
|
2 |
if((ball.x) < 0) |
3 |
{
|
4 |
xSpeed = -xSpeed; |
5 |
cpuScore.text = parseInt(cpuScore.text + 1); |
6 |
reset(); |
7 |
SoundJS.play('enemyScore'); |
8 |
}
|
9 |
/* Player Score */
|
10 |
if((ball.x + (30)) > 480) |
11 |
{
|
12 |
xSpeed = -xSpeed; |
13 |
playerScore.text = parseInt(playerScore.text + 1); |
14 |
reset(); |
15 |
SoundJS.play('playerScore'); |
16 |
}
|
Das Anmelden der Punktzahl ist einfach: Wenn der Ball den linken oder rechten Rand überschreitet, erhöht er die Punktzahl des Spielers bzw. der CPU, spielt einen Ton ab und setzt die Position der Objekte mithilfe der zuvor beschriebenen reset
funktion zurück.
1 |
|
2 |
/* CPU collision */
|
3 |
if(ball.x + 30 > cpu.x && ball.x + 30 < cpu.x + 22 && ball.y >= cpu.y && ball.y < cpu.y + 75) |
4 |
{
|
5 |
xSpeed *= -1; |
6 |
SoundJS.play('hit'); |
7 |
}
|
8 |
/* Player collision */
|
9 |
if(ball.x <= player.x + 22 && ball.x > player.x && ball.y >= player.y && ball.y < player.y + 75) |
10 |
{
|
11 |
xSpeed *= -1; |
12 |
SoundJS.play('hit'); |
13 |
}
|
Hier beschäftigen wir uns mit Kollisionen des Balls mit den Paddeln; Jedes Mal, wenn der Ball auf eines der Paddel trifft, ändert der Ball die Richtung und es wird ein Ton gespielt
1 |
if(player.y >= 249) |
2 |
{
|
3 |
player.y = 249; |
4 |
}
|
Wenn das Paddel des Spielers außerhalb der Grenzen liegt, platzieren wir es wieder innerhalb der Grenzen.
1 |
/* Check for Win */
|
2 |
if(playerScore.text == '10') |
3 |
{
|
4 |
alert('win'); |
5 |
}
|
6 |
/* Check for Game Over */
|
7 |
if(cpuScore.text == '10') |
8 |
{
|
9 |
alert('lose'); |
10 |
}
|
In diesem Snippet prüfen wir, ob einer der Punkte des Spielers 10 Punkte erreicht hat, und wenn ja, zeigen wir dem Spieler das Popup mit Gewinn oder Verlust an (entsprechend seinem Gewinnstatus).
Abschluss
Sie haben mit CreateJS ein ganzes Pong-Spiel erstellt. Vielen Dank, dass Sie sich die Zeit genommen haben, dieses Tutorial zu lesen.