Kontrol Permainan
- Hal Sebelumnya Komponen Permainan
- Hal Berikutnya Batas Permainan
按下按钮可移动红色方块:
掌控一切
现在我们要控制红色方块。
添加四个按钮:上、下、左、右。
为每个按钮编写一个函数,以沿选定方向移动组件。
pada component
构造函数中创建两个新属性,并将它们命名为 speedX
dan speedY
。这些属性被用作速度指示器。
pada component
构造函数中添加一个名为 newPos()
的函数,该函数使用 speedX
dan speedY
属性来更改组件的位置。
在绘制组件之前,从 updateGameArea
函数调用 newPos
函数:
contoh
<script> fungsi component(width, height, color, x, y) { this.width = width; this.height = height; this.speedX = 0; this.speedY = 0; this.x = x; this.y = y; this.update = function() { ctx = myGameArea.context; ctx.fillStyle = color; ctx.fillRect(this.x, this.y, this.width, this.height); } this.newPos = function() { this.x += this.speedX; this.y += this.speedY; } } fungsi updateGameArea() { myGameArea.clear(); myGamePiece.newPos(); myGamePiece.update(); } function moveup() {}} myGamePiece.speedY -= 1; } function movedown() { myGamePiece.speedY += 1; } function moveleft() { myGamePiece.speedX -= 1; } function moveright() { myGamePiece.speedX += 1; } </script> <button onclick="moveup()">Atas</button> <button onclick="movedown()">Bawah</button> <button onclick="moveleft()">KIRI</button> <button onclick="moveright()">KANAN</button>
Hentikan gerakan
Jika diperlukan, Anda dapat menghentikan blok merah saat tombol dilepas.
Tambahkan function untuk mengatur indikator kecepatan menjadi 0.
Untuk menyesuaikan layar biasa dan layar sentuh, kami akan menambahkan kode untuk kedua perangkat ini:
contoh
function stopMove() { myGamePiece.speedX = 0; myGamePiece.speedY = 0; } </script> <button onmousedown="moveup()" onmouseup="stopMove()" ontouchstart="moveup()">Atas</button> <button onmousedown="movedown()" onmouseup="stopMove()" ontouchstart="movedown()">Bawah</button> <button onmousedown="moveleft()" onmouseup="stopMove()" ontouchstart="moveleft()">KIRI</button> <button onmousedown="moveright()" onmouseup="stopMove()" ontouchstart="moveright()">KANAN</button>
papan ketik sebagai pengendali
kami juga dapat mengendalikan blok merah dengan tombol arah papan ketik.
buat method untuk memeriksa apakah tombol yang di tekan, dan lakukan myGameArea
objek key
atur properti kode tombol. Saat tombol dilepas, akan key
atur properti false
:
contoh
var myGameArea = { canvas : document.createElement("canvas"), start : function() { this.canvas.width = 480; this.canvas.height = 270; this.context = this.canvas.getContext("2d"); document.body.insertBefore(this.canvas, document.body.childNodes[0]); this.interval = setInterval(updateGameArea, 20); window.addEventListener('keydown', function (e) { myGameArea.key = e.keyCode; }) window.addEventListener('keyup', function (e) { myGameArea.key = false; }) }, clear : function(){ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); } }
Dengan cara ini, jika tombol arah yang satu ditekan, kita dapat gerakkan blok merah:
contoh
fungsi updateGameArea() { myGameArea.clear(); myGamePiece.speedX = 0; myGamePiece.speedY = 0; jika (myGameArea.key dan myGameArea.key == 37) {myGamePiece.speedX = -1; } jika (myGameArea.key dan myGameArea.key == 39) {myGamePiece.speedX = 1; } jika (myGameArea.key dan myGameArea.key == 38) {myGamePiece.speedY = -1; } jika (myGameArea.key dan myGameArea.key == 40) {myGamePiece.speedY = 1; } myGamePiece.newPos(); myGamePiece.update(); }
Menekan beberapa tombol
Bagaimana jika beberapa tombol ditekan secara bersamaan?
dalam contoh di atas, komponen hanya dapat bergerak secara horizontal atau vertikal. Sekarang kami ingin komponen dapat bergerak sepanjang diagonal juga.
untuk myGameArea
membuat objek keys
array, dan masukkan elemen untuk setiap tombol yang ditekan, dan memberikan nilai true
,nilai ini tetap true sampai tombol tidak ditekan lagi, nilai ini di keyup
fungsi pemantau peristiwa berubah menjadi false
:
contoh
var myGameArea = { canvas : document.createElement("canvas"), start : function() { this.canvas.width = 480; this.canvas.height = 270; this.context = this.canvas.getContext("2d"); document.body.insertBefore(this.canvas, document.body.childNodes[0]); this.interval = setInterval(updateGameArea, 20); window.addEventListener('keydown', function (e) { myGameArea.keys = (myGameArea.keys || []); myGameArea.keys[e.keyCode] = true; }) window.addEventListener('keyup', function (e) { myGameArea.keys[e.keyCode] = false; }) }, clear : function(){ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); } } fungsi updateGameArea() { myGameArea.clear(); myGamePiece.speedX = 0; myGamePiece.speedY = 0; jika (myGameArea.keys dan myGameArea.keys[37]) {myGamePiece.speedX = -1; } jika (myGameArea.keys dan myGameArea.keys[39]) {myGamePiece.speedX = 1; } jika (myGameArea.keys dan myGameArea.keys[38]) {myGamePiece.speedY = -1; } if (myGameArea.keys && myGameArea.keys[40]) {myGamePiece.speedY = 1; } myGamePiece.newPos(); myGamePiece.update(); }
gunakan kursor mouse sebagai pengawal
jika Anda ingin menggunakan kursor mouse untuk mengawal blok merah, silakan myGameArea
tambahkan sebuah metode ke objek untuk memperbarui koordinat x dan y kursor mouse:
contoh
var myGameArea = { canvas : document.createElement("canvas"), start : function() { this.canvas.width = 480; this.canvas.height = 270; this.canvas.style.cursor = "none"; //menyembunyikan kursor asli this.context = this.canvas.getContext("2d"); document.body.insertBefore(this.canvas, document.body.childNodes[0]); this.interval = setInterval(updateGameArea, 20); window.addEventListener('mousemove', function (e) { myGameArea.x = e.pageX; myGameArea.y = e.pageY; }) }, clear : function(){ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); } }
Lalu kami dapat menggunakan kursor mouse untuk gerakkan blok merah:
contoh
fungsi updateGameArea() { myGameArea.clear(); jika (myGameArea.x && myGameArea.y) { myGamePiece.x = myGameArea.x; myGamePiece.y = myGameArea.y; } myGamePiece.update(); }
Sentuh layar untuk mengawal permainan
kami dapat mengawal blok merah di layar sentuh.
pada myGameArea
tambahkan sebuah metode ke objek, metode ini menggunakan koordinat x dan y lokasi sentuh layar:
contoh
var myGameArea = { canvas : document.createElement("canvas"), start : function() { this.canvas.width = 480; this.canvas.height = 270; this.context = this.canvas.getContext("2d"); document.body.insertBefore(this.canvas, document.body.childNodes[0]); this.interval = setInterval(updateGameArea, 20); window.addEventListener('touchmove', function (e) { myGameArea.x = e.touches[0].screenX; myGameArea.y = e.touches[0].screenY; }) }, clear : function(){ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); } }
Lalu, saat pengguna sentuh layar, kami dapat menggunakan kode yang sama seperti kursor mouse untuk gerakkan blok merah:
contoh
fungsi updateGameArea() { myGameArea.clear(); jika (myGameArea.x && myGameArea.y) { myGamePiece.x = myGameArea.x; myGamePiece.y = myGameArea.y; } myGamePiece.update(); }
Pengawal di atas kanvas
kami dapat menggambar tombol sendiri di atas kanvas dan menggunakannya sebagai pengawal:
contoh
function startGame() { myGamePiece = new component(30, 30, "red", 10, 120); myUpBtn = new component(30, 30, "blue", 50, 10); myDownBtn = new component(30, 30, "blue", 50, 70); myLeftBtn = new component(30, 30, "blue", 20, 40); myRightBtn = new component(30, 30, "blue", 80, 40); myGameArea.start(); }
Tambahkan fungsi baru untuk menentukan apakah komponen tertentu (dalam kasus ini adalah tombol) sudah diklik.
Pertama-tama, tambahkan penjaga acara untuk memeriksa apakah tombol mouse diklik (mousedown
dan mouseup
)。Untuk menangani layar sentuh, perlu menambahkan penjaga acara untuk memeriksa apakah layar sudah diklik (touchstart
dan touchend
):
contoh
var myGameArea = { canvas : document.createElement("canvas"), start : function() { this.canvas.width = 480; this.canvas.height = 270; this.context = this.canvas.getContext("2d"); document.body.insertBefore(this.canvas, document.body.childNodes[0]); this.interval = setInterval(updateGameArea, 20); window.addEventListener('mousedown', function (e) { myGameArea.x = e.pageX; myGameArea.y = e.pageY; }) window.addEventListener('mouseup', function (e) { myGameArea.x = false; myGameArea.y = false; }) window.addEventListener('touchstart', function (e) { myGameArea.x = e.pageX; myGameArea.y = e.pageY; }) window.addEventListener('touchend', function (e) { myGameArea.x = false; myGameArea.y = false; }) }, clear : function(){ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); } }
Sekarang myGameArea
Objek memiliki properti yang dapat memberitahu kami koordinat x dan y klik. Kita menggunakan properti ini untuk memeriksa apakah klik dilakukan di salah satu tombol biru kami.
Metode baru ini disebut clicked
yang adalah component
Sebuah metode constructor, yang memeriksa apakah komponen sudah diklik.
pada updateGameArea
dalam fungsi, jika salah satu tombol biru di klik, kita akan melaksanakan operasi yang diperlukan:
contoh
fungsi component(width, height, color, x, y) { this.width = width; this.height = height; this.speedX = 0; this.speedY = 0; this.x = x; this.y = y; this.update = function() { ctx = myGameArea.context; ctx.fillStyle = color; ctx.fillRect(this.x, this.y, this.width, this.height); } this.clicked = function() { var myleft = this.x; var myright = this.x + (this.width); var mytop = this.y; var mybottom = this.y + (this.height); var clicked = true; jika ((mybottom < myGameArea.y) || (mytop > myGameArea.y) || (myright < myGameArea.x) || (myleft > myGameArea.x)) { clicked = false; } kembalikan clicked; } } fungsi updateGameArea() { myGameArea.clear(); jika (myGameArea.x && myGameArea.y) { jika (myUpBtn.clicked()) { myGamePiece.y -= 1; } jika (myDownBtn.clicked()) { myGamePiece.y += 1; } jika (myLeftBtn.clicked()) { myGamePiece.x += -1; } jika (myRightBtn.clicked()) { myGamePiece.x += 1; } } myUpBtn.update(); myDownBtn.update(); myLeftBtn.update(); myRightBtn.update(); myGamePiece.update(); }
- Hal Sebelumnya Komponen Permainan
- Hal Berikutnya Batas Permainan