Step 1:

It is recommended you create a folder structure as shown above. Put your index.html file into a folder named "game" in your Documents folder. Then create a folder name "imgs" in your "game" folder.








Step 2:
You will need to right-click and select "Save Image" and save all the sprite animations above into the "imgs" folder you have just created.
Step 3:
Add this CSS to your 'STYLE' section.
#playerGif {
position: absolute;
top: 0;
left: 0;
z-index: 2;
image-rendering: pixelated;
image-rendering: -moz-crisp-edges;
image-rendering: crisp-edges;
}
#enemyGif {
position: absolute;
top: 0;
left: 0;
z-index: 2;
image-rendering: pixelated;
image-rendering: -moz-crisp-edges;
image-rendering: crisp-edges;
}
Step 4:
Add a div for the player gif and a div for the enemy gif in the canvas container div.
<div id="canvasContainer">
<canvas id="gameCanvas" class="canvas" width="800" height="600"></canvas>
<img id="playerGif" src="./imgs/player-south.png" alt="Player GIF">
<img id="enemyGif" src="./imgs/enemy-south.png" alt="Enemy GIF">
</div>
Step 5:
In the javascript section we will add the code for updating the gif position for the player and enemy blocks.
var game_over = false;
const canvas = document.getElementById("gameCanvas");
const ctx = canvas.getContext("2d");
const player = {
x: 300,
y: 300,
width: 16,
height: 32,
speed: 3,
dx: 0,
dy: 0,
prevDx: 0,
prevDy: 0
};
const enemy = {
x: canvas.width - 300,
y: canvas.height - 300,
width: 16,
height: 32,
speed: 1,
dx: 0,
dy: 0,
prevDx: 0,
prevDy: 0
};
function drawPlayer() {
ctx.fillStyle = "blue"; // Adjust the alpha value (last parameter) for transparency // "rgba(0, 0, 0, 0)"
ctx.fillRect(player.x, player.y, player.width, player.height);
}
function drawEnemy() {
ctx.fillStyle = "red"; // "rgba(0, 0, 0, 0)"
ctx.fillRect(enemy.x, enemy.y, enemy.width, enemy.height);
}
function clearCanvas() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
function movePlayer() {
player.x += player.dx;
player.y += player.dy;
// Check collision with canvas boundries
if (checkBoundriesCollision()) {
player.x -= player.dx;
player.y -= player.dy;
player.dx = 0;
player.dy = 0;
}
// Update position of the player GIF
playerGif.style.left = (player.x + 12) + "px";
playerGif.style.top = (player.y + 20) + "px";
// Update player GIF based on movement direction
if (player.dx > 0 && player.dx !== player.prevDx) {
playerGif.src = "./imgs/player-east.png";
player.prevDx = player.dx;
player.prevDy = 0;
} else if (player.dx < 0 && player.dx !== player.prevDx) {
playerGif.src = "./imgs/player-west.png";
player.prevDx = player.dx;
player.prevDy = 0;
} else if (player.dy > 0 && player.dy !== player.prevDy) {
playerGif.src = "./imgs/player-south.png";
player.prevDy = player.dy;
player.prevDx = 0;
} else if (player.dy < 0 && player.dy !== player.prevDy) {
playerGif.src = "./imgs/player-north.png";
player.prevDy = player.dy;
player.prevDx = 0;
}
}
function moveEnemy() {
// Simple chase algorithm
if (enemy.x <= player.x) {
enemy.x += enemy.speed;
} else {
enemy.x -= enemy.speed;
}
if (enemy.y <= player.y) {
enemy.y += enemy.speed;
} else {
enemy.y -= enemy.speed;
}
// Update position of the enemy GIF
enemyGif.style.left = (enemy.x + 12) + "px";
enemyGif.style.top = (enemy.y + 20) + "px";
if (enemy.dx > 0 && enemy.dx !== enemy.prevDx) {
enemyGif.src = "enemy-east.png";
enemy.prevDx = enemy.dx;
enemy.prevDy = 0;
} else if (enemy.dx < 0 && enemy.dx !== enemy.prevDx) {
enemyGif.src = "enemy-west.png";
enemy.prevDx = enemy.dx;
enemy.prevDy = 0;
} else if (enemy.dy > 0 && enemy.dy !== enemy.prevDy) {
enemyGif.src = "enemy-south.png";
enemy.prevDy = enemy.dy;
enemy.prevDx = 0;
} else if (enemy.dy < 0 && enemy.dy !== enemy.prevDy) {
enemyGif.src = "enemy-north.png";
enemy.prevDy = enemy.dy;
enemy.prevDx = 0;
}
}
function checkBoundriesCollision() {
// Check collision with canvas boundaries
if (player.x < 0 || player.x + player.width > canvas.width || player.y < 0 || player.y + player.height > canvas.height) {
return true;
}
return false;
}
function checkPlayerEnemyCollision() {
if (
player.x < enemy.x + enemy.width &&
player.x + player.width > enemy.x &&
player.y < enemy.y + enemy.height &&
player.y + player.height > enemy.y
) {
game_over = true;
}
}
function showGameOverPopup() {
// Create a new div element
const gameOverDiv = document.createElement("div");
// Set styles for the div
gameOverDiv.style.position = "absolute";
gameOverDiv.style.width = "100%";
gameOverDiv.style.top = "50%";
gameOverDiv.style.left = "50%";
gameOverDiv.style.transform = "translate(-50%, -50%)";
gameOverDiv.style.backgroundColor = "rgba(0, 0, 0, 0)";
gameOverDiv.style.color = "red";
gameOverDiv.style.fontSize = "64px";
gameOverDiv.style.padding = "20px";
gameOverDiv.style.textAlign = "center";
gameOverDiv.style.borderRadius = "10px";
gameOverDiv.style.zIndex = "9999";
gameOverDiv.style.fontFamily = "'Press Start 2P', system-ui"; // Use Press Start 2P font
// Set the text content
gameOverDiv.textContent = "Game Over";
// Get the existing canvas container element
var canvasContainer = document.getElementById("canvasContainer");
// Append gameOverDiv to canvasContainer
canvasContainer.appendChild(gameOverDiv);
}
function gameLoop() {
if (!game_over) {
clearCanvas();
drawPlayer();
drawEnemy();
movePlayer();
moveEnemy();
checkPlayerEnemyCollision();
requestAnimationFrame(gameLoop);
} else {
// Show game over popup
showGameOverPopup();
// You can add game over logic here
}
}
document.addEventListener("keydown", function (event) {
switch (event.key) {
case "w":
player.dy = -player.speed;
break;
case "a":
player.dx = -player.speed;
break;
case "s":
player.dy = player.speed;
break;
case "d":
player.dx = player.speed;
break;
}
});
document.addEventListener("keyup", function (event) {
switch (event.key) {
case "w":
case "s":
player.dy = 0;
break;
case "a":
case "d":
player.dx = 0;
break;
}
});
gameLoop();
The Full Code:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://fonts.googleapis.com/css2?family=Press+Start+2P&display=swap" rel="stylesheet">
<title>Dungeon Chase</title>
<style>
body {
margin: 0;
overflow: hidden;
position: relative;
}
#gameCanvas {
position: absolute;
top: 0;
left: 0;
z-index: 0;
}
canvas {
display: block;
margin: 0 auto;
}
.canvas {
background-color:black;
border:20px solid grey;
border-radius:10px;
}
#canvasContainer {
position: relative;
width: 800px; /* Adjust width as needed */
height: 600px; /* Adjust height as needed */
margin: auto; /* Center the container */
}
#playerGif {
position: absolute;
top: 0;
left: 0;
z-index: 2;
image-rendering: pixelated;
image-rendering: -moz-crisp-edges;
image-rendering: crisp-edges;
}
#enemyGif {
position: absolute;
top: 0;
left: 0;
z-index: 2;
image-rendering: pixelated;
image-rendering: -moz-crisp-edges;
image-rendering: crisp-edges;
}
</style>
</head>
<body>
<div id="canvasContainer">
<canvas id="gameCanvas" class="canvas" width="800" height="600"></canvas>
<img id="playerGif" src="./imgs/player-south.png" alt="Player GIF">
<img id="enemyGif" src="./imgs/enemy-south.png" alt="Enemy GIF">
</div>
<script>
var game_over = false;
const canvas = document.getElementById("gameCanvas");
const ctx = canvas.getContext("2d");
const player = {
x: 300,
y: 300,
width: 16,
height: 32,
speed: 3,
dx: 0,
dy: 0,
prevDx: 0,
prevDy: 0
};
const enemy = {
x: canvas.width - 300,
y: canvas.height - 300,
width: 16,
height: 32,
speed: 1,
dx: 0,
dy: 0,
prevDx: 0,
prevDy: 0
};
function drawPlayer() {
ctx.fillStyle = "blue"; // Adjust the alpha value (last parameter) for transparency // "rgba(0, 0, 0, 0)"
ctx.fillRect(player.x, player.y, player.width, player.height);
}
function drawEnemy() {
ctx.fillStyle = "red"; // "rgba(0, 0, 0, 0)"
ctx.fillRect(enemy.x, enemy.y, enemy.width, enemy.height);
}
function clearCanvas() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
function movePlayer() {
player.x += player.dx;
player.y += player.dy;
// Check collision with canvas boundries
if (checkBoundriesCollision()) {
player.x -= player.dx;
player.y -= player.dy;
player.dx = 0;
player.dy = 0;
}
// Update position of the player GIF
playerGif.style.left = (player.x + 12) + "px";
playerGif.style.top = (player.y + 20) + "px";
// Update player GIF based on movement direction
if (player.dx > 0 && player.dx !== player.prevDx) {
playerGif.src = "./imgs/player-east.png";
player.prevDx = player.dx;
player.prevDy = 0;
} else if (player.dx < 0 && player.dx !== player.prevDx) {
playerGif.src = "./imgs/player-west.png";
player.prevDx = player.dx;
player.prevDy = 0;
} else if (player.dy > 0 && player.dy !== player.prevDy) {
playerGif.src = "./imgs/player-south.png";
player.prevDy = player.dy;
player.prevDx = 0;
} else if (player.dy < 0 && player.dy !== player.prevDy) {
playerGif.src = "./imgs/player-north.png";
player.prevDy = player.dy;
player.prevDx = 0;
}
}
function moveEnemy() {
// Simple chase algorithm
if (enemy.x <= player.x) {
enemy.x += enemy.speed;
} else {
enemy.x -= enemy.speed;
}
if (enemy.y <= player.y) {
enemy.y += enemy.speed;
} else {
enemy.y -= enemy.speed;
}
// Update position of the enemy GIF
enemyGif.style.left = (enemy.x + 12) + "px";
enemyGif.style.top = (enemy.y + 20) + "px";
if (enemy.dx > 0 && enemy.dx !== enemy.prevDx) {
enemyGif.src = "enemy-east.png";
enemy.prevDx = enemy.dx;
enemy.prevDy = 0;
} else if (enemy.dx < 0 && enemy.dx !== enemy.prevDx) {
enemyGif.src = "enemy-west.png";
enemy.prevDx = enemy.dx;
enemy.prevDy = 0;
} else if (enemy.dy > 0 && enemy.dy !== enemy.prevDy) {
enemyGif.src = "enemy-south.png";
enemy.prevDy = enemy.dy;
enemy.prevDx = 0;
} else if (enemy.dy < 0 && enemy.dy !== enemy.prevDy) {
enemyGif.src = "enemy-north.png";
enemy.prevDy = enemy.dy;
enemy.prevDx = 0;
}
}
function checkBoundriesCollision() {
// Check collision with canvas boundaries
if (player.x < 0 || player.x + player.width > canvas.width || player.y < 0 || player.y + player.height > canvas.height) {
return true;
}
return false;
}
function checkPlayerEnemyCollision() {
if (
player.x < enemy.x + enemy.width &&
player.x + player.width > enemy.x &&
player.y < enemy.y + enemy.height &&
player.y + player.height > enemy.y
) {
game_over = true;
}
}
function showGameOverPopup() {
// Create a new div element
const gameOverDiv = document.createElement("div");
// Set styles for the div
gameOverDiv.style.position = "absolute";
gameOverDiv.style.width = "100%";
gameOverDiv.style.top = "50%";
gameOverDiv.style.left = "50%";
gameOverDiv.style.transform = "translate(-50%, -50%)";
gameOverDiv.style.backgroundColor = "rgba(0, 0, 0, 0)";
gameOverDiv.style.color = "red";
gameOverDiv.style.fontSize = "64px";
gameOverDiv.style.padding = "20px";
gameOverDiv.style.textAlign = "center";
gameOverDiv.style.borderRadius = "10px";
gameOverDiv.style.zIndex = "9999";
gameOverDiv.style.fontFamily = "'Press Start 2P', system-ui"; // Use Press Start 2P font
// Set the text content
gameOverDiv.textContent = "Game Over";
// Get the existing canvas container element
var canvasContainer = document.getElementById("canvasContainer");
// Append gameOverDiv to canvasContainer
canvasContainer.appendChild(gameOverDiv);
}
function gameLoop() {
if (!game_over) {
clearCanvas();
drawPlayer();
drawEnemy();
movePlayer();
moveEnemy();
checkPlayerEnemyCollision();
requestAnimationFrame(gameLoop);
} else {
// Show game over popup
showGameOverPopup();
// You can add game over logic here
}
}
document.addEventListener("keydown", function (event) {
switch (event.key) {
case "w":
player.dy = -player.speed;
break;
case "a":
player.dx = -player.speed;
break;
case "s":
player.dy = player.speed;
break;
case "d":
player.dx = player.speed;
break;
}
});
document.addEventListener("keyup", function (event) {
switch (event.key) {
case "w":
case "s":
player.dy = 0;
break;
case "a":
case "d":
player.dx = 0;
break;
}
});
gameLoop();
</script>
</body>
</html>