Hey honey! 💖
Today I’m going to show you how to create a retro mini game. But hold on, it won’t be one of those boring technical tutorials. 😎
In this guide, you’ll:
- Learn exactly how to use Canvas
- Explore movement and collision logic with JS
- Control the game’s speed, score, and enemies
- Develop your own game immediately with code examples and tips 💻🎉
Let’s get started, because the stage is yours, baby! 💃🕺
1️⃣ What is Canvas and Why Use It? 🖼️✨
Canvas is a pixel-based drawing surface in HTML. Think of it as a drawing board:
- You can draw lines, shapes, images, animations with JS
- Create dynamic and interactive games right before the user’s eyes
Example: Simple Canvas Setup
<canvas id="gameCanvas" width="600" height="400" style="border:2px solid #000;"></canvas>
💡 Tip, darling:
- Use the
idto access Canvas in JS - Adjust
widthandheightfor your game area - Use
styleto add borders and visually define the game area
2️⃣ Designing the Game 🎯
Our mini game:
- A small square (player) can move
- Enemies appear randomly from the screen
- Collision ends the game with “Game Over!”
- A score counter will track survival, and the game gradually becomes harder
💡 Practical tip: Sketch your design on paper first, plan the elements and movements. This makes coding much easier.
3️⃣ Moving the Player with JS 🕹️
We can control the player using keyboard events:
const canvas = document.getElementById("gameCanvas");
const ctx = canvas.getContext("2d");
let player = { x: 50, y: 180, width: 40, height: 40, speed: 5 };
document.addEventListener("keydown", movePlayer);
function movePlayer(e) {
if(e.key === "ArrowUp" && player.y > 0) player.y -= player.speed;
if(e.key === "ArrowDown" && player.y < canvas.height - player.height) player.y += player.speed;
if(e.key === "ArrowLeft" && player.x > 0) player.x -= player.speed;
if(e.key === "ArrowRight" && player.x < canvas.width - player.width) player.x += player.speed;
}
Code Explanation, honey 💖:
keydowntriggers whenever a key is pressed- Arrow keys control direction
player.speeddetermines how many pixels the player moves per key press- Boundary checks prevent the player from leaving the canvas
💡 Practical tip: Adjust speed according to player level. Increasing player.speed as the game progresses makes it more challenging.
4️⃣ Drawing the Player 🎨
function drawPlayer() {
ctx.fillStyle = "blue";
ctx.fillRect(player.x, player.y, player.width, player.height);
}
Explanation:
fillRect(x, y, width, height)draws a rectanglefillStylesets the color- Without clearing the canvas, previous frames remain, so we’ll use
ctx.clearRect()in the game loop
💡 Tip: Later, you can replace the rectangle with a sprite for a retro pixel character!
5️⃣ Adding Enemies 🛸
Enemies will move randomly and disappear offscreen:
let enemies = [];
function createEnemy() {
let y = Math.random() * (canvas.height - 30);
enemies.push({ x: canvas.width, y: y, width: 30, height: 30, speed: 3 });
}
function drawEnemies() {
ctx.fillStyle = "red";
enemies.forEach(e => ctx.fillRect(e.x, e.y, e.width, e.height));
}
function moveEnemies() {
enemies.forEach(e => e.x -= e.speed);
enemies = enemies.filter(e => e.x + e.width > 0);
}
Code Explanation 💖:
Math.random()sets random Y positionsfilterremoves enemies that move offscreenspeedcontrols enemy movement speed
💡 Practical tip: Increase enemy speed or size over time to make the game more challenging.
6️⃣ Collision Logic 🛑
When a collision occurs, the game ends:
function checkCollision(player, enemy) {
return player.x < enemy.x + enemy.width &&
player.x + player.width > enemy.x &&
player.y < enemy.y + enemy.height &&
player.y + player.height > enemy.y;
}
function gameOver() {
alert("Game Over! 😱");
document.location.reload();
}
Explanation:
- Basic rectangle collision (AABB)
- Calls
gameOver()if the condition is met
💡 Tip: For advanced games, implement collision with sprites or irregular shapes.
7️⃣ Game Loop and Animation 🔄
function gameLoop() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawPlayer();
drawEnemies();
moveEnemies();
enemies.forEach(enemy => {
if(checkCollision(player, enemy)) gameOver();
});
requestAnimationFrame(gameLoop);
}
setInterval(createEnemy, 2000); // New enemy every 2 seconds
gameLoop();
Code Explanation:
requestAnimationFrame= smooth animationclearRect= clears previous framesetInterval= spawns enemies at intervals
💡 Tip: Speed up the game by shortening the enemy spawn interval or increasing enemy numbers.
8️⃣ Score System ✨
let score = 0;
function drawScore() {
ctx.fillStyle = "black";
ctx.font = "20px Arial";
ctx.fillText("Score: " + score, 10, 20);
}
// Inside game loop
score++;
drawScore();
💡 Tip:
- Player earns points for survival time
- Keep track of the score before collision
- Add colorful effects or sound to make it more fun
9️⃣ Bonus: Advanced Tips 😎
- Different enemy types: Fast, slow, large, or small
- Use sprites: Replace squares with images or animations
- Level system: Increase speed and enemy count over time
- Sound effects: Add audio for collisions, points, and level-ups
💡 Honey: Small tweaks make your game infinitely more fun! 🎉
🔟 Summary and Final Words
Honey, now you have:
- Canvas = stage
- JS = magical brush
- Player and enemies = game characters
- requestAnimationFrame = smooth motion
- Collision = game difficulty
Your retro mini game is ready! 💻🎮✨
💡 Final tip: Change colors, increase enemy speed, add power-ups… make your game both fun and educational! 😎💖