JSFiddle - React, Tailwind, and code Playground
by Ben Centra
HTML
<canvas id="canvas" width="600" height="400" tabindex="1"></canvas>
CSS
#canvas {
width: 600px;
height: 400px;
border: 1px solid black;
}
JavaScript
// Arcade Shooter game
// Get a reference to the canvas DOM element
var canvas = document.getElementById('canvas');
// Get the canvas drawing context
var context = canvas.getContext('2d');
// Create an object representing a square on the canvas
function makeSquare(x, y, length, speed) {
return {
x: x,
y: y,
l: length,
s: speed,
draw: function() {
context.fillRect(this.x, this.y, this.l, this.l);
}
};
}
// The ship the user controls
var ship = makeSquare(50, canvas.height / 2 - 25, 50, 5);
// Flags to tracked which keys are pressed
var up = false;
var down = false;
var space = false;
// Is a bullet already on the canvas?
var shooting = false;
// The bulled shot from the ship
var bullet = makeSquare(0, 0, 10, 10);
// An array for enemies (in case there are more than one)
var enemies = [];
// Add an enemy object to the array
var enemyBaseSpeed = 2;
function makeEnemy() {
var enemyX = canvas.width;
var enemySize = Math.round((Math.random() * 15)) + 15;
var enemyY = Math.round(Math.random() * (canvas.height - enemySize * 2)) + enemySize;
var enemySpeed = Math.round(Math.random() * enemyBaseSpeed) + enemyBaseSpeed;
enemies.push(makeSquare(enemyX, enemyY, enemySize, enemySpeed));
}
// Check if number a is in the range b to c (exclusive)
function isWithin(a, b, c) {
return (a > b && a < c);
}
// Return true if two squares a and b are colliding, false otherwise
function isColliding(a, b) {
var result = false;
if (isWithin(a.x, b.x, b.x + b.l) || isWithin(a.x + a.l, b.x, b.x + b.l)) {
if (isWithin(a.y, b.y, b.y + b.l) || isWithin(a.y + a.l, b.y, b.y + b.l)) {
result = true;
}
}
return result;
}
// Track the user's score
var score = 0;
// The delay between enemies (in milliseconds)
var timeBetweenEnemies = 5 * 1000;
// ID to track the spawn timeout
var timeoutId = null;
// Show the game menu and instructions
function menu() {
erase();
context.fillStyle = '#000000';
context.font = '36px...