Controle do Jogo
- Página Anterior Componentes do Jogo
- Próxima Página Obstáculo do Jogo
按下按钮可移动红色方块:
掌控一切
现在我们要控制红色方块。
添加四个按钮:上、下、左、右。
为每个按钮编写一个函数,以沿选定方向移动组件。
no component
构造函数中创建两个新属性,并将它们命名为 speedX
e speedY
。这些属性被用作速度指示器。
no component
构造函数中添加一个名为 newPos()
的函数,该函数使用 speedX
e speedY
属性来更改组件的位置。
在绘制组件之前,从 updateGameArea
函数调用 newPos
函数:
instância
<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()">CIMA</button> <button onclick="movedown()">BAIXO</button> <button onclick="moveleft()">ESQUERDA</button> <button onclick="moveright()">DIREITA</button>
Parar movimento
Se necessário, você pode fazer com que o quadrado vermelho pare ao soltar o botão.
Adicionar uma função que define o indicador de velocidade como 0.
Para lidar com telas normais e touchscreens, adicionaremos código para ambos os dispositivos:
instância
function stopMove() { myGamePiece.speedX = 0; myGamePiece.speedY = 0; {} </script> <button onmousedown="moveup()" onmouseup="stopMove()" ontouchstart="moveup()">CIMA</button> <button onmousedown="movedown()" onmouseup="stopMove()" ontouchstart="movedown()">BAIXO</button> <button onmousedown="moveleft()" onmouseup="stopMove()" ontouchstart="moveleft()">ESQUERDA</button> <button onmousedown="moveright()" onmouseup="stopMove()" ontouchstart="moveright()">DIREITA</button>
O teclado como controlador
Podemos controlar o quadrado vermelho usando as setas do teclado.
Criar um método para verificar se alguma tecla foi pressionada e armazenar myGameArea
do objeto key
A propriedade é configurada como código de tecla. Quando a tecla for solta, será key
A propriedade é configurada como falso
:
instância
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); {} {}
Desta forma, se uma das teclas de direção for pressionada, podemos mover o quadrado vermelho:
instância
function updateGameArea() { myGameArea.clear(); myGamePiece.speedX = 0; myGamePiece.speedY = 0; se (myGameArea.key && myGameArea.key == 37) {myGamePiece.speedX = -1; } se (myGameArea.key && myGameArea.key == 39) {myGamePiece.speedX = 1; } se (myGameArea.key && myGameArea.key == 38) {myGamePiece.speedY = -1; } se (myGameArea.key && myGameArea.key == 40) {myGamePiece.speedY = 1; } myGamePiece.newPos(); myGamePiece.update(); {}
Pressionar várias teclas
E se várias teclas forem pressionadas ao mesmo tempo?
No exemplo acima, o componente pode se mover apenas horizontalmente ou verticalmente. Agora, queremos que o componente também possa se mover em diagonal.
para myGameArea
objeto cria um keys
array, inserindo um elemento para cada tecla pressionada e atribuindo-lhe o valor verdadeiro
, este valor permanece verdadeiro até que a tecla não seja mais pressionada, este valor está no keyup
A função de escuta de evento se torna falso
:
instância
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; se (myGameArea.keys && myGameArea.keys[37]) {myGamePiece.speedX = -1; } se (myGameArea.keys && myGameArea.keys[39]) {myGamePiece.speedX = 1; } se (myGameArea.keys && myGameArea.keys[38]) {myGamePiece.speedY = -1; } if (myGameArea.keys && myGameArea.keys[40]) {myGamePiece.speedY = 1; } myGamePiece.newPos(); myGamePiece.update(); {}
Usar o cursor do mouse como controle
Se você quiser usar o cursor do mouse para controlar o quadrado vermelho, em myGameArea
Adicionar um método ao objeto para atualizar as coordenadas x e y do cursor do mouse:
instância
var myGameArea = { canvas : document.createElement("canvas"), start : function() { this.canvas.width = 480; this.canvas.height = 270; this.canvas.style.cursor = "none"; //ocultar o cursor original 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); {} {}
Então podemos usar o cursor do mouse para mover o quadrado vermelho:
instância
function updateGameArea() { myGameArea.clear(); if (myGameArea.x && myGameArea.y) { myGamePiece.x = myGameArea.x; myGamePiece.y = myGameArea.y; {} myGamePiece.update(); {}
Toque na tela para controlar o jogo
Também podemos controlar o quadrado vermelho no touchscreen.
no myGameArea
Adicionar um método ao objeto que usa as coordenadas x e y da posição do toque na tela:
instância
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); {} {}
Então, quando o usuário tocar na tela, podemos usar o mesmo código do cursor do mouse para mover o quadrado vermelho:
instância
function updateGameArea() { myGameArea.clear(); if (myGameArea.x && myGameArea.y) { myGamePiece.x = myGameArea.x; myGamePiece.y = myGameArea.y; {} myGamePiece.update(); {}
Controles no canvas
Podemos desenhar nossos próprios botões no canvas e usá-los como controles:
instância
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(); {}
Adicione uma nova função para determinar se um componente (no exemplo, um botão) foi clicado.
Primeiro, adicione ouvintes de eventos para verificar se o botão do mouse foi clicado(mousedown
e mouseup
)。Para lidar com a tela tátil, também é necessário adicionar ouvintes de eventos para verificar se a tela foi clicada(touchstart
e touchend
):
instância
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); {} {}
Agora myGameArea
O objeto tem atributos que nos informam as coordenadas x e y do clique. Usamos esses atributos para verificar se um dos nossos botões azuis foi clicado.
Este novo método é chamado clicked
é component
Um método do construtor que verifica se o componente foi clicado.
no updateGameArea
dentro da função, se clicarmos em um dos botões azuis, executaremos as operações necessárias:
instância
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(); {}
- Página Anterior Componentes do Jogo
- Próxima Página Obstáculo do Jogo