La interacción con el usuario es un componente clave de muchas aplicaciones web, y en HTML5 Canvas, manejar eventos del mouse es fundamental para crear experiencias interactivas. Vamos a ver cómo detectar y manejar estos eventos en un contexto de Canvas.
Asegúrate de tener tu elemento <canvas>
listo en tu archivo HTML:
Interacción con Mouse en Canvas
En el archivo JavaScript asociado (script.js
), comenzaremos configurando algunos elementos básicos para interactuar con el canvas.
Primero, dibujemos un objeto simple que el usuario pueda interactuar, como un círculo:
var canvas = document.getElementById('miCanvas');
var ctx = canvas.getContext('2d');
var circle = {
x: 250,
y: 200,
size: 30,
color: 'blue'
};
function drawCircle() {
ctx.fillStyle = circle.color;
ctx.beginPath();
ctx.arc(circle.x, circle.y, circle.size, 0, Math.PI * 2);
ctx.fill();
}
drawCircle();
Ahora, añadiremos eventos del mouse para interactuar con el círculo. Podemos manejar eventos como mousedown
, mouseup
, mousemove
, etc.
Vamos a hacer que el círculo cambie de color cuando el usuario haga clic en él. Primero, necesitamos una función para verificar si el clic ocurrió dentro del círculo:
function isInside(pos, obj) {
return Math.sqrt((pos.x - obj.x) ** 2 + (pos.y - obj.y) ** 2) < obj.size;
}
canvas.addEventListener('mousedown', function(event) {
var rect = canvas.getBoundingClientRect();
var mouseX = event.clientX - rect.left;
var mouseY = event.clientY - rect.top;
if (isInside({x: mouseX, y: mouseY}, circle)) {
circle.color = circle.color === 'blue' ? 'red' : 'blue';
drawCircle(); // Redibujar el círculo con el nuevo color
}
});
isInside
: Calcula si la posición del clic del mouse está dentro del círculo utilizando el teorema de Pitágoras.mousedown
:isInside
para verificar si el clic fue dentro del círculo y cambia el color si es necesario.Empezaremos por establecer la base de nuestro proyecto con un archivo HTML que contenga un elemento <canvas>
.
Juego Simple en Canvas
El archivo JavaScript (script.js
) contendrá toda la lógica del juego. Comencemos por dibujar algunos elementos básicos y configurar la interactividad.
Vamos a dibujar un personaje y algunos obstáculos.
var canvas = document.getElementById('miCanvas');
var ctx = canvas.getContext('2d');
// Personaje
var player = {
x: 100,
y: 550,
width: 50,
height: 50,
color: 'blue'
};
// Obstáculo
var obstacle = {
x: 300,
y: 550,
width: 50,
height: 50,
color: 'red'
};
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height); // Limpiar el canvas
// Dibujar el personaje
ctx.fillStyle = player.color;
ctx.fillRect(player.x, player.y, player.width, player.height);
// Dibujar el obstáculo
ctx.fillStyle = obstacle.color;
ctx.fillRect(obstacle.x, obstacle.y, obstacle.width, obstacle.height);
requestAnimationFrame(draw);
}
draw();
Para hacer el juego interactivo, permitiremos al jugador mover el personaje usando el teclado.
function movePlayer(event) {
// Detectar la tecla presionada
if (event.key === 'ArrowLeft') {
player.x -= 10;
} else if (event.key === 'ArrowRight') {
player.x += 10;
}
}
window.addEventListener('keydown', movePlayer);
Incorporemos algunos elementos de juego como la detección de colisiones y el marcador.
function checkCollision(rect1, rect2) {
return rect1.x < rect2.x + rect2.width &&
rect1.x + rect1.width > rect2.x &&
rect1.y < rect2.y + rect2.height &&
rect1.y + rect1.height > rect2.y;
}
function updateGame() {
if (checkCollision(player, obstacle)) {
alert('¡Colisión detectada!');
// Reiniciar la posición del jugador
player.x = 100;
}
}
Finalmente, actualizaremos nuestro bucle de animación para incluir la lógica de juego y redibujar los elementos en cada fotograma.
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = player.color;
ctx.fillRect(player.x, player.y, player.width, player.height);
ctx.fillStyle = obstacle.color;
ctx.fillRect(obstacle.x, obstacle.y, obstacle.width, obstacle.height);
updateGame();
requestAnimationFrame(draw);
}
draw();