Files
Gists/breakout.coffee/breakout.js
2023-06-19 09:38:01 -04:00

234 lines
5.6 KiB
JavaScript

// Generated by CoffeeScript 2.3.2
(function() {
var ballRadius, brickColumnCount, brickHeight, brickOffsetLeft, brickOffsetTop, brickPadding, brickRowCount, brickWidth, bricks, c, canvas, collisionDetection, ctx, drawBall, drawBricks, drawLives, drawPaddle, drawScore, dx, dy, gameLoop, i, j, keyDownHandler, keyUpHandler, leftPressed, lives, mouseMoveHandler, paddleHeight, paddleWidth, paddleX, r, ref, ref1, rightPressed, score, x, y;
canvas = document.getElementById("myCanvas");
ctx = canvas.getContext("2d");
// Player
score = 0;
lives = 3;
drawScore = function() {
ctx.font = "16px Arial";
ctx.fillStyle = "#0095DD";
return ctx.fillText("Score: " + score, 8, 20);
};
drawLives = function() {
ctx.font = "16px Arial";
ctx.fillStyle = "#0095DD";
return ctx.fillText("Lives: " + lives, canvas.width - 65, 20);
};
// Ball
x = canvas.width / 2;
y = canvas.height - 30;
dx = 2;
dy = -2;
ballRadius = 10;
drawBall = function() {
ctx.beginPath();
ctx.arc(x, y, ballRadius, 0, Math.PI * 2);
ctx.fillStyle = "#0095DD";
ctx.fill();
return ctx.closePath();
};
// Paddle
paddleHeight = 10;
paddleWidth = 75;
paddleX = (canvas.width - paddleWidth) / 2;
rightPressed = false;
leftPressed = false;
drawPaddle = function() {
ctx.beginPath();
ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight);
ctx.fillStyle = "#0095DD";
ctx.fill();
return ctx.closePath();
};
// Bricks
brickRowCount = 3;
brickColumnCount = 5;
brickWidth = 75;
brickHeight = 20;
brickPadding = 10;
brickOffsetTop = 30;
brickOffsetLeft = 30;
bricks = [];
for (c = i = 0, ref = brickColumnCount; (0 <= ref ? i < ref : i > ref); c = 0 <= ref ? ++i : --i) {
bricks[c] = [];
for (r = j = 0, ref1 = brickRowCount; (0 <= ref1 ? j < ref1 : j > ref1); r = 0 <= ref1 ? ++j : --j) {
bricks[c][r] = {
x: (c * (brickWidth + brickPadding)) + brickOffsetLeft,
y: (r * (brickHeight + brickPadding)) + brickOffsetTop,
active: true
};
}
}
drawBricks = function() {
var b, col, drawSingleBrick, k, len, results;
drawSingleBrick = function(brick) {
ctx.beginPath();
ctx.rect(brick.x, brick.y, brickWidth, brickHeight);
ctx.fillStyle = "#0095DD";
ctx.fill();
return ctx.closePath();
};
results = [];
for (k = 0, len = bricks.length; k < len; k++) {
col = bricks[k];
results.push((function() {
var l, len1, results1;
results1 = [];
for (l = 0, len1 = col.length; l < len1; l++) {
b = col[l];
if (b.active) {
results1.push(drawSingleBrick(b));
} else {
results1.push(void 0);
}
}
return results1;
})());
}
return results;
};
collisionDetection = function() {
var b, col, k, len, results;
results = [];
for (k = 0, len = bricks.length; k < len; k++) {
col = bricks[k];
results.push((function() {
var l, len1, results1;
results1 = [];
for (l = 0, len1 = col.length; l < len1; l++) {
b = col[l];
if (b.active && x > b.x && x < b.x + brickWidth && y > b.y && y < b.y + brickHeight) {
dy = -dy;
b.active = false;
score++;
if (score === brickRowCount * brickColumnCount) {
alert("A winner is you!");
results1.push(document.location.reload());
} else {
results1.push(void 0);
}
} else {
results1.push(void 0);
}
}
return results1;
})());
}
return results;
};
// Game loop
gameLoop = function() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawBricks();
drawBall();
drawPaddle();
drawScore();
drawLives();
collisionDetection();
x += dx;
y += dy;
if ((x + dx > canvas.width - ballRadius) || (x + dx < ballRadius)) {
dx = -dx;
}
if (y + dy < ballRadius) {
dy = -dy;
}
if (y + dy > canvas.height - ballRadius) {
if (x > paddleX && x < paddleX + paddleWidth) {
dy = -dy - 0.25;
if (dx >= 0) {
dx += 0.25;
} else {
dx -= 0.25;
}
} else {
lives--;
if (!lives) {
alert("Game over, man!");
document.location.reload();
} else {
x = canvas.width / 2;
y = canvas.height - 30;
dx = 2;
dy = -2;
paddleX = (canvas.width - paddleWidth) / 2;
}
}
}
if (rightPressed && paddleX < canvas.width - paddleWidth) {
paddleX += 7;
}
if (leftPressed && paddleX > 0) {
paddleX -= 7;
}
return requestAnimationFrame(gameLoop);
};
// Input handlers
keyDownHandler = function(e) {
if (e.keyCode === 39) {
return rightPressed = true;
} else if (e.keyCode === 37) {
return leftPressed = true;
}
};
keyUpHandler = function(e) {
if (e.keyCode === 39) {
return rightPressed = false;
} else if (e.keyCode === 37) {
return leftPressed = false;
}
};
mouseMoveHandler = function(e) {
var hw, relativeX;
hw = paddleWidth / 2;
relativeX = e.clientX - canvas.offsetLeft;
if (relativeX > hw && relativeX < canvas.width - hw) {
return paddleX = relativeX - hw;
}
};
// Initialization
document.addEventListener("keydown", keyDownHandler, false);
document.addEventListener("keyup", keyUpHandler, false);
document.addEventListener("mousemove", mouseMoveHandler, false);
gameLoop();
}).call(this);