Mempelajari CreateJS dengan Membangun Permainan Pong HTML5
() translation by (you can also view the original English article)
Web bergerak cepat - begitu cepat sehingga tutorial EaselJS asli kami sudah ketinggalan zaman! Dalam tutorial ini, Anda akan belajar bagaimana menggunakan suite CreateJS terbaru dengan membuat klon Pong sederhana.
Pratinjau Hasil Akhir
Mari kita lihat hasil akhir yang akan kita jalani:
Tutorial ini didasarkan pada Membuat Permainan Pong di HTML5 Dengan EaselJS oleh Carlos Yanez, yang dibangun dengan panduan Memulai Dengan EaselJS-nya. Efek grafis dan suara semua diambil dari tutorial sebelumnya.
Langkah 1: Membuat index.html
Ini akan menjadi file index.html
utama kita:
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> |
Seperti yang Anda lihat, ini cukup singkat dan terutama terdiri dari pemuatan perpustakaan CreateJS.
Sejak diluncurkannya CreateJS (yang pada dasarnya menggabungkan semua perpustakaan EaselJS yang terpisah), kita tidak lagi harus mengunduh file JS dan meng-hostnya di situs kita; file tersebut sekarang ditempatkan di CDN (Content Delivery Network) yang memungkinkan kita memuat file-file ini dari jarak jauh secepat mungkin.
Mari meninjau kodenya:
1 |
<style>/* Removes Mobile Highlight */ *{-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}</style> |
Baris ini menghilangkan sorotan mobile yang mungkin muncul saat Anda mencoba memainkan game di mobile. (Sorotan mobile menyebabkan objek canvas disorot sehingga mengabaikan gerakan jari Anda.)
Selanjutnya, kita memiliki pemuatan perpustakaan CreateJS:>
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> |
Kode ini memuat file JS dari CDN CreateJS dan pada dasarnya memungkinkan kita untuk menggunakan salah satu fungsi CreateJS dalam kode kita
Selanjutnya, kita akan memuat plugin SoundJS Flash, yang memberikan dukungan suara untuk browser yang tidak mendukung Audio HTML5. Ini dilakukan dengan menggunakan SWF (objek Flash) untuk memuat suara.
1 |
<script src="assets/soundjs.flashplugin-0.2.0.min.js"></script> |
Dalam hal ini kita tidak akan menggunakan CDN; sebagai gantinya, kita akan mengunduh perpustakaan SoundJS dari http://createjs.com/#!/SoundJS/download dan letakkan file soundjs.flashplugin-0.2.0.min.js
dan FlashAudioPlugin.swf
di folder lokal yang diberi nama assets
.
Terakhir di antara file JS, kita akan memuat file Main.js
yang berisi semua kode ke permainan kita:
1 |
<script src="Main.js"></script> |
Akhirnya, mari kita letakkan objek canvas di atas panggung kita.
1 |
<body onload="Main();"> |
2 |
<canvas id="PongStage" width="480" height="320"></canvas> |
3 |
</body> |
Sekarang kita bisa mulai mengerjakan kode permainannya.
Langkah 2: Variabel-variabel
Kode permainan kita akan berada di dalam sebuah file bernama Main.js
, jadi buat dan simpan sekarang.
Pertama-tama, mari kita definisikan variabel-variabel untuk semua objek grafis dalam permainan:
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 |
Saya telah menambahkan komentar untuk setiap variabel sehingga Anda tahu apa yang akan kita muat di variabel tersebut
Selanjutnya, skornya:
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 |
Kita akan, membutuhkan variabel untuk kecepatan bola:
1 |
// Variables
|
2 |
|
3 |
var xSpeed = 5; |
4 |
var ySpeed = 5; |
Anda dapat mengubah nilai ini menjadi apapun yang Anda inginkan, jika Anda ingin membuat permainan menjadi lebih mudah atau lebih sulit.
Jika Anda adalah pengembang Flash, Anda tahu onEnterFrame
dari Flash sangat berguna saat membuat permainan, karena ada hal-hal yang perlu terjadi di setiap bingkai yang diberikan. (Jika Anda tidak terbiasa dengan ide ini, lihat artikel ini di Game Loop.)
Kita memiliki persamaan untuk onEnterFrame
di CreateJS, dan itu adalah objek ticker
, yang dapat menjalankan kode setiap fraksi dalam sedetik. Mari buat variabel yang akan menautkannya:
1 |
var tkr = new Object; |
Selanjutnya kita memiliki preloader, yang akan menggunakan metode PreloadJS yang baru.
1 |
//preloader
|
2 |
var preloader; |
3 |
var manifest; |
4 |
var totalLoaded = 0; |
-
preloader
- akan berisi objek PreloadJS. -
manifest
- akan menyimpan daftar file yang perlu kita muat. -
totalLoaded
- variabel ini akan menyimpan sejumlah file yang sudah termuat.
Yang tidak kalah penting dalam daftar variabel kita, kita memiliki TitleView
, yang akan menyimpan beberapa grafis untuk menampilkannya bersama-sama (seperti DisplayObjectContainer
dari Flash).
1 |
var TitleView = new Container(); |
Mari beralih ke fungsi Main...
Langkah 3: Fungsi Main()
Fungsi ini adalah fungsi pertama yang berjalan setelah semua file JS dari index.html
dimuat. Tapi apa yang memanggil fungsi ini?
Nah, ingat baris ini dari file index.html
?
1 |
<body onload="Main();"> |
Cuplikan kode ini menyatakan bahwa begitu HTML (dan perpustakaan JS) dimuat, fungsi Main
harus dijalankan.
Mari kita tinjau:
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 |
}
|
Mari kita rinci setiap bagian:
1 |
canvas = document.getElementById('PongStage'); |
2 |
stage = new Stage(canvas); |
3 |
|
4 |
stage.mouseEventsEnabled = true; |
Di sini kita menghubungkan objek Canvas PongStage
dari file index.html
ke variabel canvas, dan kemudian membuat objek Stage dari canvas tersebut. (Panggungnya akan memungkinkan kita untuk menempatkan objek di atasnya.)
mouseEventsEnabled
memungkinkan kita untuk menggunakan event mouse, jadi kita bisa mendeteksi gerakan dan klik mouse.
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 |
}
|
Di sini kita mengkonfigurasi dimana plugin suara Flash berada pada browser yang tidak didukung Audio HTML5
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 |
];
|
Dalam variabel manifest kita menempatkan sebuah array dari file-file yang ingin kita muat (dan memberikan ID unik untuk masing-masing). Setiap suara memiliki dua format - MP3 dan OGG - karena browser yang berbeda (tidak)kompatibel dengan format yang berbeda.
1 |
preloader = new PreloadJS(); |
2 |
preloader.installPlugin(SoundJS); |
3 |
preloader.onProgress = handleProgress; |
4 |
preloader.onComplete = handleComplete; |
5 |
preloader.onFileLoad = handleFileLoad; |
6 |
preloader.loadManifest(manifest); |
Di sini kita mengkonfigurasi objek preloader menggunakan PreloadJS. PreloadJS adalah tambahan baru untuk perpustakaan CreateJS dan cukup berguna.
Kita membuat objek PreloadJS baru dan menempatkannya di variabel preloader
, kemudian menetapkan sebuah metode ke setiap event (onProgress
, onComplete
, onFileLoad
). Akhirnya kita menggunakan preloader
untuk memuat manifest yang kita buat sebelumnya.
1 |
Ticker.setFPS(30); |
2 |
Ticker.addListener(stage); |
Di sini kita menambahkan objek Ticker ke atas panggung dan mengatur frame rate menjadi 30 FPS; kita akan menggunakannya nanti di permainan untuk fungsi enterFrame
.
Langkah 4: Membuat Fungsi Preloader
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 |
}
|
Mari kita tinjau fungsinya:
-
handleProgress
- Dalam fungsi ini Anda dapat mengikuti persentase kemajuan pemuatan menggunakan parameter ini:event.loaded
. Anda bisa menggunakan ini untuk misalnya membuat progress bar. -
handleComplete
- Fungsi ini dipanggil sekali begitu semua file telah dimuat (jika Anda ingin menempatkan sesuatu di sana). -
handleFileLoad
- Karena kita memuat dua jenis file - gambar dan suara - kita memiliki fungsi ini yang akan menangani masing-masing secara terpisah. Jika itu adalah gambar, kita membuat gambar bitmap dan menempatkannya dalam variabel (yang namanya sama dengan ID gambar yang dimuat) dan kemudian memanggil fungsihandleLoadComplete
(yang akan kita tulis selanjutnya); jika itu suara maka kita langsung saja memanggilhandleLoadComplete
.
Sekarang mari kita bahas fungsi handleLoadComplete
yang baru saja saya sebutkan:
1 |
function handleLoadComplete(event) |
2 |
{
|
3 |
|
4 |
totalLoaded++; |
5 |
|
6 |
if(manifest.length==totalLoaded) |
7 |
{
|
8 |
addTitleView(); |
9 |
}
|
10 |
}
|
Ini adalah fungsi yang cukup sederhana; kita meningkatkan variabel totalLoaded
(yang menyimpan jumlah aset yang dimuat sejauh ini) dan kemudian kita memeriksa apakah jumlah item dalam manifest kita sama dengan jumlah aset yang dimuat, dan jika demikian, masuk ke layar Main Menu.
Langkah 5: Membuat Main Menu



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; |
Main MenuTidak ada yang spesial disini. Kita menempatkan gambar Background, Start Button dan Credits Button di atas panggung dan menautkan event handler onPress
ke tombol Start dan Credits.
Berikut adalah fungsi yang menampilkan dan menghapus layar kredit dan tweenTitleView
yang memulai permainannya:
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 |
}
|
Langkah 6: Kode Permainan



Kita telah mencapai bagian utama dari tutorial ini yang merupakan kode permainan itu sendiri.
Pertama-tama, kita perlu menambahkan semua aset yang dibutuhkan ke atas panggung, jadi kita melakukannya di fungsi 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 |
}
|
Sekali lagi, fungsi yang cukup sederhana yang menempatkan objek-objek di layar dan menambahkan mouseEvent ke gambar latar belakang, sehingga saat pengguna mengkliknya, permainan akan dimulai (kita akan memanggil fungsi startGame
).
Mari kita tinjau fungsi startGame
:
1 |
function startGame(e) |
2 |
{
|
3 |
bg.onPress = null; |
4 |
stage.onMouseMove = movePaddle; |
5 |
|
6 |
Ticker.addListener(tkr, false); |
7 |
tkr.tick = update; |
8 |
}
|
Disini, seperti yang bisa Anda lihat, selain menambahkan event onMouseMove
yang akan menggerakkan bat kita. Kita menambahkan event tick
, yang akan memanggil fungsi update
di setiap frame.
Mari tinjau fungsi movePaddle
and reset
:
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 |
}
|
Di movePaddle
, pada dasarnya kita menempatkan bat pengguna pada koordinat y mouse.
Di reset
, kita melakukan sesuatu yang mirip dengan addGameView
, kecuali disini kita tidak menambahkan elemen grafis karena sudah ada di layar.
Dengan menggunakan fungsi alert
, kita akan menampilkan popup yang menang dan kalah.
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 |
}
|
Langkah 7: Perulangan Permainan
Sekarang, untuk bagian akhir tutorial kita, kita akan mengerjakan fungsi update
(yang terjadi di setiap frame permainan - mirip dengan onEnterFrame
dari Flash):
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 |
}
|
Tampak menakutkan, bukan? Jangan khawatir, kami akan mengulas setiap bagian dan mendiskusikannya.
1 |
// Ball Movement
|
2 |
|
3 |
ball.x = ball.x + xSpeed; |
4 |
ball.y = ball.y + ySpeed; |
Di setiap frame, bola akan bergerak sesuai dengan nilai kecepatan x dan y-nya
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 |
}
|
Di sini kita memiliki dasar AI dari komputer, di mana bat komputer hanya mengikuti bola tanpa logika khusus. Kita hanya membandingkan lokasi pusat bat (oleh karena itu kami menambahkan 32 piksel ke nilai cpu Y) ke lokasi bola, dengan offset kecil, dan memindahkan bat ke atas atau bawah seperlunya.
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 |
};
|
Jika bola menyentuh batas atas atau batas bawah layar, bola akan berubah arah dan kita memainkan suara Wall Hit.
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 |
}
|
Login skor sederhana: jika bola melewati batas kiri atau kanan, ia meningkatkan skor pemain atau CPU masing-masing, memainkan suara, dan me-reset lokasi objek menggunakan fungsi reset
yang telah kita bahas sebelumnya.
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 |
}
|
Di sini kita berhadapan dengan tabrakan bola dengan bat; setiap kali bola menyentuh salah satu bat, bola akan berubah arah dan suara dimainkan
1 |
if(player.y >= 249) |
2 |
{
|
3 |
player.y = 249; |
4 |
}
|
Jika bat pemain keluar dari batas, kita menempatkannya kembali dalam batas.
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 |
}
|
Dalam cuplikan ini, kita memeriksa apakah salah satu dari skor pemain telah mencapai 10 poin, dan jika demikian, kita menampilkan popup kemenangan atau kekalahan pada pemain (sesuai status kemenangannya).
Kesimpulan
Itu saja, Anda telah membuat keseluruhan permainan pong menggunakan CreateJS. Terima kasih telah meluangkan waktu untuk membaca tutorial ini.