Empuje los botones para mover el cuadrado rojo:
Obtener en el Control
Ahora queremos controlar el cuadrado rojo.
Agregue cuatro botones, arriba, abajo, izquierda y derecha.
Escribe una función para cada botón para mover el componente en la dirección seleccionada.
Hacer dos nuevas propiedades en el component
constructor, y llamarlos speedX
y speedY
. Estas propiedades están siendo utilizados como indicadores de velocidad.
Añadir una función en el component
constructor, llamado newPos()
, que utiliza el speedX
y speedY
propiedades para cambiar la posición del componente.
La función NewPos se llama desde la función updateGameArea antes de extraer el componente:
Ejemplo
<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()">UP</button>
<button
onclick="movedown()">DOWN</button>
<button
onclick="moveleft()">LEFT</button>
<button
onclick="moveright()">RIGHT</button>
Inténtalo tú mismo " dejar de moverse
Si lo desea, puede hacer la parada cuadrado rojo cuando se suelta un botón.
Añadir una función que va a establecer los indicadores de velocidad a 0.
Para hacer frente a las dos pantallas normales y pantallas táctiles, añadiremos código para los dos dispositivos:
Ejemplo
function
stopMove() {
myGamePiece.speedX = 0;
myGamePiece.speedY = 0;
}
</script>
<button
omousedown="moveup()" onmouseup="stopMove()"
ontouchstart="moveup() ">UP</button>
<button
omousedown="movedown()" onmouseup="stopMove()"
ontouchstart="movedown()" >DOWN</button>
<button
omousedown="moveleft()" onmouseup="stopMove()"
ontouchstart="moveleft()" >LEFT</button>
<button
omousedown="moveright()" onmouseup="stopMove()"
ontouchstart="moveright()" >RIGHT</button>
Inténtalo tú mismo " El teclado como controlador
También podemos controlar el cuadrado rojo mediante el uso de las teclas de flecha del teclado.
Crear un método que comprueba si se pulsa una tecla, y establecer la key
propiedad de la myGameArea
objeto al código de la llave. Cuando se suelta la tecla, establezca la key
propiedad a false
:
Ejemplo
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);
}
}
Entonces podemos mover el cuadrado rojo si una de las teclas de flecha se presionan:
Ejemplo
function updateGameArea() {
myGameArea.clear();
myGamePiece.speedX = 0;
myGamePiece.speedY =
0;
if (myGameArea.key && myGameArea.key == 37)
{myGamePiece.speedX = -1; }
if (myGameArea.key &&
myGameArea.key == 39) {myGamePiece.speedX = 1; }
if
(myGameArea.key && myGameArea.key == 38) {myGamePiece.speedY = -1; }
if (myGameArea.key && myGameArea.key == 40) {myGamePiece.speedY = 1; }
myGamePiece.newPos();
myGamePiece.update();
}
Inténtalo tú mismo " Varias teclas pulsadas
¿Qué pasa si se pulsa más de una tecla al mismo tiempo?
En el ejemplo anterior, el componente sólo puede moverse horizontalmente o verticalmente. Ahora queremos que el componente se mueva también en diagonal.
Crear un keys
matriz para la myGameArea
objeto, e insertar un elemento para cada tecla que se presiona, y darle el valor true
, el valor sigue siendo cierto hasta que la llave ya no es presionado, el valor se convierte en false
en la función de evento keyup oyente:
Ejemplo
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;
if ( myGameArea.keys && myGameArea.keys[37] )
{myGamePiece.speedX = -1; }
if ( myGameArea.keys &&
myGameArea.keys[39] ) {myGamePiece.speedX = 1; }
if
( myGameArea.keys && myGameArea.keys[38] ) {myGamePiece.speedY = -1; }
if ( myGameArea.keys && myGameArea.keys[40] ) {myGamePiece.speedY = 1; }
myGamePiece.newPos();
myGamePiece.update();
}
Inténtalo tú mismo " Con el ratón cursor como un controlador
Si desea controlar el cuadrado rojo utilizando el cursor del ratón, añadir un método en el myGameArea
objeto que actualiza las coordenadas X e Y del cursor del ratón :.
Ejemplo
var myGameArea = {
canvas :
document.createElement("canvas"),
start : function() {
this.canvas.width = 480;
this.canvas.height = 270;
this.canvas.style.cursor = "none"; //hide the original cursor
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);
}
}
Entonces podemos mover el cuadrado rojo con el cursor del ratón:
Ejemplo
function updateGameArea() {
myGameArea.clear();
if (myGameArea.x && myGameArea.y) {
myGamePiece.x = myGameArea.x;
myGamePiece.y = myGameArea.y;
}
myGamePiece.update();
}
Inténtalo tú mismo " Tocar la pantalla para controlar el juego
También podemos controlar el cuadrado rojo en una pantalla táctil.
Añadir un método en el myGameArea
objeto que utiliza las coordenadas X e Y de donde se toca la pantalla:
Ejemplo
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);
}
}
Entonces podemos mover el cuadrado rojo si el usuario toca la pantalla, utilizando el mismo código como lo hicimos para el cursor del ratón:
Ejemplo
function updateGameArea() {
myGameArea.clear();
if (myGameArea.touchX && myGameArea.touchY) {
myGamePiece.x = myGameArea.x;
myGamePiece.y =
myGameArea.y;
}
myGamePiece.update();
}
Inténtalo tú mismo " Los controladores en el lienzo
También podemos sacar nuestras propias botones de la tela, y los utilizan como controladores:
Ejemplo
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();
}
Añadir una nueva función que se da cuenta de si un componente, en este caso un botón, se hace clic.
Comience agregando detectores de eventos para comprobar si un botón del ratón se hace clic ( mousedown
and mouseup
) . Para hacer frente a pantallas táctiles, también añadir detectores de eventos para comprobar si se hace clic en la pantalla ( touchstart
and touchend
) :
Ejemplo
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);
}
}
Ahora el myGameArea
objeto tiene propiedades que nos dice la x e y las coordenadas de un clic. Utilizamos theese propiedades para comprobar si el clic se realizó en uno de nuestros botones de color azul.
El nuevo método se llama clicked
, es un método de la component
constructor, y se comprueba si se está hace clic en el componente.
En el updateGameArea
función, tomamos las acciones neccessarry si se pulsa uno de los botones de color azul:
Ejemplo
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();
}
Inténtalo tú mismo "