Ahora que tenemos un gran laberinto para navegar en nuestro juego, posiblemente deseemos agregar un reto mayor a él a través de enemigos, pero estos deben verse afectados por su entorno e interactuar con él. ¿Cómo se consigue esto?
Para empezar, necesitamos un arreglo donde contener a nuestros enemigos.
Para mover a los enemigos, sumamos el valor de vx o vy a su posición respectivamente, y verificamos si hay alguna intersección con alguna pared. En caso de ser así, multiplicamos su vector de desplazamiento por -1 para que cambie a la dirección opuesta, y lo movemos de regreso al escenario. Esto lo hacemos primero en el eje x y luego en el eje y:
Para empezar, necesitamos un arreglo donde contener a nuestros enemigos.
var enemies = [];
Para agregar a los enemigos con precisión dentro del laberinto, los representaremos con valores numéricos en el arreglo del mapa. Para este ejemplo he creado dos enemigos básicos: El representado por un 3 para un enemigo que se mueve de izquierda a derecha, y el representado por un 4 para un enemigo que se mueve de arriba a abajo. Para agregarlos al arreglo que los ha de contener, he modificado la función "setMap" agregando la siguiente condicional en el "for": } else if (map[row][col] > 2) {
enemy = new Rectangle2D(col * blockSize, row * blockSize, blockSize, blockSize, true);
if (map[row][col] === 3) {
enemy.vx = 5;
} else if (map[row][col] === 4) {
enemy.vy = 5;
}
enemies.push(enemy);
}
Básicamente decimos que cualquier valor por encima de 2 será un enemigo y lo creamos. Si el valor es 3 hacemos que se mueva en x y si el valor es 4, hacemos que se mueva en y, y finalmente, lo empujamos al final del arreglo. No olvides limpiar el arreglo antes de de volverlo a llenar, tal como se hizo con los demás arreglos.Para mover a los enemigos, sumamos el valor de vx o vy a su posición respectivamente, y verificamos si hay alguna intersección con alguna pared. En caso de ser así, multiplicamos su vector de desplazamiento por -1 para que cambie a la dirección opuesta, y lo movemos de regreso al escenario. Esto lo hacemos primero en el eje x y luego en el eje y:
// Move enemies
for (i = 0, l = enemies.length; i < l; i += 1) {
if (enemies[i].vx !== 0) {
enemies[i].x += enemies[i].vx;
for (j = 0, jl = wall.length; j < jl; j += 1) {
if (enemies[i].intersects(wall[j])) {
enemies[i].vx *= -1;
enemies[i].x += enemies[i].vx;
break;
}
}
}
if (enemies[i].vy !== 0) {
enemies[i].y += enemies[i].vy;
for (j = 0, jl = wall.length; j < jl; j += 1) {
if (enemies[i].intersects(wall[j])) {
enemies[i].vy *= -1;
enemies[i].y += enemies[i].vy;
break;
}
}
}
}
Nota que estas acciones solo se hacen en caso de ser su vector diferente a 0, de esta forma, evitamos hacer todo el proceso si no existe movimiento en dicho eje. Finalmente, comprobamos si el enemigo colisiona con el jugador dentro de este mismo ciclo, y de ser así, realizamos las tareas necesarias para terminar el juego, de igual forma que se hace con la lava: // Player Intersects Enemy
if (player.intersects(enemies[i])) {
gameover = true;
pause = true;
}
No olvides dibujar el enemigo en pantalla: // Draw enemies
ctx.fillStyle = '#0ff';
for (i = 0, l = enemies.length; i < l; i += 1) {
enemies[i].fill(ctx, cam);
}
Con esto tendremos listo el código para poner enemigos en el juego que interactúen con el mapa. Podríamos agregar una condicional para que mueran con la lava, pero dado que ello no tiene lógica pues morirían tan pronto empiece el mapa, mejor evitamos que dicha condición ocurra. Solo resta agregar algunos "3"s y "4"s al arreglo de nuestros mapas donde creamos conveniente. Puedes revisar donde los he puesto yo en el código final.Código final:
/*jslint bitwise: true, es5: true */
(function (window, undefined) {
'use strict';
var KEY_ENTER = 13,
KEY_LEFT = 37,
KEY_UP = 38,
KEY_RIGHT = 39,
KEY_DOWN = 40,
canvas = null,
ctx = null,
lastPress = null,
pressing = [],
pause = false,
gameover = true,
currentMap = 0,
worldWidth = 0,
worldHeight = 0,
cam = null,
player = null,
wall = [],
lava = [],
enemies = [],
maps = [];
maps[0] = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 2, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
[1, 1, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 1, 0, 0, 1],
[0, 2, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 1, 0, 0, 0],
[0, 2, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 1, 0, 0, 0],
[1, 1, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 1, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
];
maps[1] = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1],
[1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1],
[1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 1, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1],
[1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 2, 0, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 0, 0, 2, 2, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 1, 0, 2, 2, 2, 2, 0, 1, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 0, 1, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 0, 1, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 1, 0, 0, 0, 0, 1, 0, 0, 1],
[1, 1, 1, 1, 0, 0, 0, 0, 1, 2, 2, 2, 2, 1, 1, 0, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 1, 0, 0, 0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0, 1, 2, 2, 2, 2, 1, 1, 0, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 1, 1, 0, 1, 1, 2, 2, 2, 1, 0, 0, 0, 0, 1, 1, 1, 1],
[1, 0, 0, 1, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 0, 1, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 1, 0, 1, 2, 2, 2, 2, 1, 0, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 1, 0, 2, 2, 2, 2, 0, 1, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 2, 0, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 0, 0, 2, 2, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 2, 2, 2, 0, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 1, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 2, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1],
[1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1],
[1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
];
maps[2] = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 2, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 0, 1],
[1, 2, 2, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 1, 2, 2, 1],
[1, 1, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1],
[1, 2, 2, 0, 0, 4, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 4, 0, 0, 2, 2, 1],
[1, 2, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 2, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 2, 2, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 1, 1, 1],
[1, 1, 2, 2, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 1],
[1, 2, 0, 0, 0, 1, 1, 1, 0, 2, 2, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 0, 0, 1],
[1, 2, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 1],
[1, 2, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1],
[1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1],
[1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
];
function Camera() {
this.x = 0;
this.y = 0;
}
Camera.prototype = {
constructor: Camera,
focus: function (x, y) {
this.x = x - canvas.width / 2;
this.y = y - canvas.height / 2;
if (this.x < 0) {
this.x = 0;
} else if (this.x > worldWidth - canvas.width) {
this.x = worldWidth - canvas.width;
}
if (this.y < 0) {
this.y = 0;
} else if (this.y > worldHeight - canvas.height) {
this.y = worldHeight - canvas.height;
}
}
};
function Rectangle2D(x, y, width, height, createFromTopLeft) {
this.width = (width === undefined) ? 0 : width;
this.height = (height === undefined) ? this.width : height;
if (createFromTopLeft) {
this.left = (x === undefined) ? 0 : x;
this.top = (y === undefined) ? 0 : y;
} else {
this.x = (x === undefined) ? 0 : x;
this.y = (y === undefined) ? 0 : y;
}
}
Rectangle2D.prototype = {
constructor: Rectangle2D,
left: 0,
top: 0,
width: 0,
height: 0,
vx: 0,
vy: 0,
get x() {
return this.left + this.width / 2;
},
set x(value) {
this.left = value - this.width / 2;
},
get y() {
return this.top + this.height / 2;
},
set y(value) {
this.top = value - this.height / 2;
},
get right() {
return this.left + this.width;
},
set right(value) {
this.left = value - this.width;
},
get bottom() {
return this.top + this.height;
},
set bottom(value) {
this.top = value - this.height;
},
intersects: function (rect) {
if (rect !== undefined) {
return (this.left < rect.right &&
this.right > rect.left &&
this.top < rect.bottom &&
this.bottom > rect.top);
}
},
fill: function (ctx) {
if (ctx !== undefined) {
if (cam !== undefined) {
ctx.fillRect(this.left - cam.x, this.top - cam.y, this.width, this.height);
} else {
ctx.fillRect(this.left, this.top, this.width, this.height);
}
}
}
};
document.addEventListener('keydown', function (evt) {
lastPress = evt.which;
pressing[evt.which] = true;
}, false);
document.addEventListener('keyup', function (evt) {
pressing[evt.which] = false;
}, false);
function setMap(map, blockSize) {
var col = 0,
row = 0,
columns = 0,
rows = 0,
enemy = null;
wall.length = 0;
lava.length = 0;
enemies.length = 0;
for (row = 0, rows = map.length; row < rows; row += 1) {
for (col = 0, columns = map[row].length; col < columns; col += 1) {
if (map[row][col] === 1) {
wall.push(new Rectangle2D(col * blockSize, row * blockSize, blockSize, blockSize, true));
} else if (map[row][col] === 2) {
lava.push(new Rectangle2D(col * blockSize, row * blockSize, blockSize, blockSize, true));
} else if (map[row][col] > 2) {
enemy = new Rectangle2D(col * blockSize, row * blockSize, blockSize, blockSize, true);
if (map[row][col] === 3) {
enemy.vx = 5;
} else if (map[row][col] === 4) {
enemy.vy = 5;
}
enemies.push(enemy);
}
}
}
worldWidth = columns * blockSize;
worldHeight = rows * blockSize;
}
function reset() {
player.left = 40;
player.top = 100;
gameover = false;
}
function paint(ctx) {
var i = 0,
l = 0;
// Clean canvas
ctx.fillStyle = '#000';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// Draw player
ctx.fillStyle = '#0f0';
player.fill(ctx, cam);
// Draw walls
ctx.fillStyle = '#999';
for (i = 0, l = wall.length; i < l; i += 1) {
wall[i].fill(ctx, cam);
}
// Draw lava
ctx.fillStyle = '#f00';
for (i = 0, l = lava.length; i < l; i += 1) {
lava[i].fill(ctx, cam);
}
// Draw enemies
ctx.fillStyle = '#0ff';
for (i = 0, l = enemies.length; i < l; i += 1) {
enemies[i].fill(ctx, cam);
}
// Debug last key pressed
ctx.fillStyle = '#fff';
ctx.fillText('Last Press: ' + lastPress, 0, 20);
// Draw pause
if (pause) {
ctx.textAlign = 'center';
if (gameover) {
ctx.fillText('GAMEOVER', 150, 100);
} else {
ctx.fillText('PAUSE', 150, 100);
}
ctx.textAlign = 'left';
}
}
function act(deltaTime) {
var i = 0,
l = 0,
j = 0,
jl = 0;
if (!pause) {
// GameOver Reset
if (gameover) {
reset();
}
// Move Rect
if (pressing[KEY_UP]) {
player.y -= 5;
for (i = 0, l = wall.length; i < l; i += 1) {
if (player.intersects(wall[i])) {
player.top = wall[i].bottom;
}
}
}
if (pressing[KEY_RIGHT]) {
player.x += 5;
for (i = 0, l = wall.length; i < l; i += 1) {
if (player.intersects(wall[i])) {
player.right = wall[i].left;
}
}
}
if (pressing[KEY_DOWN]) {
player.y += 5;
for (i = 0, l = wall.length; i < l; i += 1) {
if (player.intersects(wall[i])) {
player.bottom = wall[i].top;
}
}
}
if (pressing[KEY_LEFT]) {
player.x -= 5;
for (i = 0, l = wall.length; i < l; i += 1) {
if (player.intersects(wall[i])) {
player.left = wall[i].right;
}
}
}
// Out Screen
if (player.x > worldWidth) {
currentMap += 1;
if (currentMap > maps.length - 1) {
currentMap = 0;
}
setMap(maps[currentMap], 10);
player.x = 0;
}
if (player.y > worldHeight) {
player.y = 0;
}
if (player.x < 0) {
currentMap -= 1;
if (currentMap < 0) {
currentMap = maps.length - 1;
}
setMap(maps[currentMap], 10);
player.x = worldWidth;
}
if (player.y < 0) {
player.y = worldHeight;
}
// Move enemies
for (i = 0, l = enemies.length; i < l; i += 1) {
if (enemies[i].vx !== 0) {
enemies[i].x += enemies[i].vx;
for (j = 0, jl = wall.length; j < jl; j += 1) {
if (enemies[i].intersects(wall[j])) {
enemies[i].vx *= -1;
enemies[i].x += enemies[i].vx;
break;
}
}
}
if (enemies[i].vy !== 0) {
enemies[i].y += enemies[i].vy;
for (j = 0, jl = wall.length; j < jl; j += 1) {
if (enemies[i].intersects(wall[j])) {
enemies[i].vy *= -1;
enemies[i].y += enemies[i].vy;
break;
}
}
}
// Player Intersects Enemy
if (player.intersects(enemies[i])) {
gameover = true;
pause = true;
}
}
// Player Intersects Lava
for (i = 0, l = lava.length; i < l; i += 1) {
if (player.intersects(lava[i])) {
gameover = true;
pause = true;
}
}
// Focus player
cam.focus(player.x, player.y);
}
// Pause/Unpause
if (lastPress === KEY_ENTER) {
pause = !pause;
lastPress = null;
}
}
function repaint() {
window.requestAnimationFrame(repaint);
paint(ctx);
}
function run() {
setTimeout(run, 50);
act(0.05);
}
function init() {
// Get canvas and context
canvas = document.getElementById('canvas');
ctx = canvas.getContext('2d');
canvas.width = 300;
canvas.height = 200;
worldWidth = canvas.width;
worldHeight = canvas.height;
// Create camera and player
cam = new Camera();
player = new Rectangle2D(40, 40, 10, 10, true);
// Set initial map
setMap(maps[0], 10);
// Start game
run();
repaint();
}
window.addEventListener('load', init, false);
}(window));
Regresar al índice
GENIALLLL
ResponderBorrarKarl q pasa! Oye sabrias como calcular rutas de los enemigos, cortas? Para q vayan de un punto a otro por el camino mas corto. Un saludo crack
ResponderBorrarPor como lo describes, creo que buscas un algoritmo de búsqueda de camino. Siendo este el caso, busca sobre el algoritmo A*, hay muchos sitios donde te explican su funcionamiento, y ya tienen códigos en JS. ¡Suerte! ¡Felices códigos!
Borrar