Kontrolery gry
- Poprzednia strona Komponenty gry
- Następna strona Przeszkody gry
按下按钮可移动红色方块:
掌控一切
现在我们要控制红色方块。
添加四个按钮:上、下、左、右。
为每个按钮编写一个函数,以沿选定方向移动组件。
w component
构造函数中创建两个新属性,并将它们命名为 speedX
i speedY
。这些属性被用作速度指示器。
w component
构造函数中添加一个名为 newPos()
的函数,该函数使用 speedX
i speedY
属性来更改组件的位置。
在绘制组件之前,从 updateGameArea
函数调用 newPos
函数:
实例
<script> function 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; } } function 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()">GÓRA</button> <button onclick="movedown()">DOLU</button> <button onclick="moveleft()">LEWO</button> <button onclick="moveright()">PRAWO</button>
Zatrzymaj ruch
Jeśli to konieczne, możesz zatrzymać czerwony blok, gdy puszczasz przycisk.
Dodaj funkcję ustawiającą wskaźnik prędkości na 0.
Aby dostosować się do normalnych ekranów i ekranów dotykowych, dodamy kod dla obu tych urządzeń:
实例
function stopMove() { myGamePiece.speedX = 0; myGamePiece.speedY = 0; } </script> <button onmousedown="moveup()" onmouseup="stopMove()" ontouchstart="moveup()">GÓRA</button> <button onmousedown="movedown()" onmouseup="stopMove()" ontouchstart="movedown()">DOLU</button> <button onmousedown="moveleft()" onmouseup="stopMove()" ontouchstart="moveleft()">LEWO</button> <button onmousedown="moveright()" onmouseup="stopMove()" ontouchstart="moveright()">PRAWO</button>
Klawiatura jako kontroler
Możemy również kontrolować czerwony blok za pomocą klawiatury kierunkowej.
stworzyć metodę do sprawdzania, czy któryś z klawiszy został naciśnięty, i przypisać myGameArea
obiektu key
Atrybut ustawiony na kod klawisza. Kiedy klawisz jest puszczany, wartość key
Atrybut ustawiony na false
:
实例
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); } }
W ten sposób, jeśli wcisnie się jeden z klawiszy kierunkowych, możemy przesunąć czerwony blok:
实例
function updateGameArea() { myGameArea.clear(); myGamePiece.speedX = 0; myGamePiece.speedY = 0; jeśli (myGameArea.key && myGameArea.key == 37) {myGamePiece.speedX = -1; } jeśli (myGameArea.key && myGameArea.key == 39) {myGamePiece.speedX = 1; } jeśli (myGameArea.key && myGameArea.key == 38) {myGamePiece.speedY = -1; } jeśli (myGameArea.key && myGameArea.key == 40) {myGamePiece.speedY = 1; } myGamePiece.newPos(); myGamePiece.update(); }
wciskanie kilku przycisków
Co się stanie, jeśli jednocześnie wcisnie się kilka przycisków?
w powyższym przykładzie, komponent może się poruszać tylko poziomo lub pionowo. Teraz chcemy, aby komponent mógł się poruszać również po przekątnej.
dla myGameArea
obiekt tworzy keys
w tablicy, wstawiając element dla każdego wciskanego przycisku i przypisując mu wartość true
do momentu, gdy nie przestanie się wciskać przycisk, wartość ta pozostaje keyup
funkcja słuchacza zdarzeń zmienia się na false
:
实例
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); } } function updateGameArea() { myGameArea.clear(); myGamePiece.speedX = 0; myGamePiece.speedY = 0; jeśli (myGameArea.keys && myGameArea.keys[37]) {myGamePiece.speedX = -1; } jeśli (myGameArea.keys && myGameArea.keys[39]) {myGamePiece.speedX = 1; } jeśli (myGameArea.keys && myGameArea.keys[38]) {myGamePiece.speedY = -1; } if (myGameArea.keys && myGameArea.keys[40]) {myGamePiece.speedY = 1; } myGamePiece.newPos(); myGamePiece.update(); }
Używaj kursora myszy jako kontrolera
Jeśli chcesz używać kursora myszy do kontrolowania czerwonego kwadratu, włącz: myGameArea
Dodajemy metodę w obiekcie, aby aktualizować współrzędne x i y kursora myszy:
实例
var myGameArea = { canvas : document.createElement("canvas"), start : function() { this.canvas.width = 480; this.canvas.height = 270; this.canvas.style.cursor = "none"; //ukryj oryginalny kursor 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); } }
Następnie możemy używać kursora myszy, aby przesunąć czerwony kwadrat:
实例
function updateGameArea() { myGameArea.clear(); if (myGameArea.x && myGameArea.y) { myGamePiece.x = myGameArea.x; myGamePiece.y = myGameArea.y; } myGamePiece.update(); }
Dotknij ekranu, aby kontrolować grę
Mamy również możliwość kontrolowania czerwonego kwadratu na ekranie dotykowym.
w myGameArea
Dodajemy metodę w obiekcie, która używa współrzędnych x i y pozycji dotyku ekranu:
实例
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); } }
Następnie, gdy użytkownik dotknie ekranu, możemy użyć tego samego kodu co dla kursora myszy, aby przesunąć czerwony kwadrat:
实例
function updateGameArea() { myGameArea.clear(); if (myGameArea.x && myGameArea.y) { myGamePiece.x = myGameArea.x; myGamePiece.y = myGameArea.y; } myGamePiece.update(); }
Kontrolery na kanwie
Mamy możliwość rysowania własnych przycisków na kanwie i używania ich jako kontrolerów:
实例
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(); }
Dodaj nową funkcję, aby określić, czy dany komponent (w tym przypadku przycisk) został kliknięty。
Najpierw dodaj słuchacz事件 do sprawdzania, czy został kliknięty przycisk myszy(mousedown
i mouseup
)。Aby obsługiwać ekran dotykowy, należy dodać słuchacz事件 do sprawdzania, czy ekran został kliknięty(touchstart
i touchend
):
实例
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); } }
Teraz myGameArea
Obiekt ma atrybuty, które mogą nam powiedzieć, gdzie na ekranie został wykonany klik. Używamy tych atrybutów, aby sprawdzić, czy kliknięcie miało miejsce na jednym z naszych niebieskich przycisków.
Ta nowa metoda nazywa się clicked
jest component
Metoda konstruktora, która sprawdza, czy komponent został kliknięty.
w updateGameArea
W funkcji, jeśli klikniemy na jeden z niebieskich przycisków, wykonamy niezbędne operacje:
实例
function 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; if ((mybottom < myGameArea.y) || (mytop > myGameArea.y) || (myright < myGameArea.x) || (myleft > myGameArea.x)) { clicked = false; } return clicked; } } function updateGameArea() { myGameArea.clear(); if (myGameArea.x && myGameArea.y) { if (myUpBtn.clicked()) { myGamePiece.y -= 1; } if (myDownBtn.clicked()) { myGamePiece.y += 1; } if (myLeftBtn.clicked()) { myGamePiece.x += -1; } if (myRightBtn.clicked()) { myGamePiece.x += 1; } } myUpBtn.update(); myDownBtn.update(); myLeftBtn.update(); myRightBtn.update(); myGamePiece.update(); }
- Poprzednia strona Komponenty gry
- Następna strona Przeszkody gry