diff --git a/frontend/static/js/views/Game.js b/frontend/static/js/views/Game.js
index 62b8e80..4354d0a 100644
--- a/frontend/static/js/views/Game.js
+++ b/frontend/static/js/views/Game.js
@@ -10,22 +10,41 @@ export default class extends AbstractView {
return `
Game
+
`;
}
async postInit() {
- document.getElementById('startGameButton').onclick = this.startGame;
+ document.getElementById('startGameButton').onclick = this.startGame.bind(this);
+ document.getElementById('stopGameButton').onclick = this.stopGame.bind(this);
}
startGame() {
- if (this.game == null)
+ if (this.game == null) {
+ document.getElementById('startGameButton').innerHTML = 'Reset Game';
this.game = new Game;
+ }
+ else {
+ document.getElementById('app').removeChild(this.game.canvas);
+ this.game.cleanup();
+ this.game = new Game;
+ }
+ }
+
+ stopGame() {
+ if (!this.game)
+ return;
+ document.getElementById('app').removeChild(this.game.canvas);
+ this.game.cleanup();
+ this.game = null;
+ document.getElementById('startGameButton').innerHTML = 'Start Game';
}
}
class Game {
constructor() {
this.canvas = document.createElement('canvas');
+ this.canvas.id = 'gameCanvas';
this.canvas.width = 480;
this.canvas.height = 270;
this.canvas.style.border = '1px solid #d3d3d3';
@@ -33,13 +52,22 @@ class Game {
this.context = this.canvas.getContext('2d');
this.paddle = new Paddle(this.context);
+ this.ball = new Ball(this.context);
document.getElementById('app').appendChild(this.canvas);
this.interval = setInterval(this.updateGame.bind(this), 10);
this.keys = [];
- document.addEventListener('keydown', this.keyDownHandler.bind(this));
- document.addEventListener('keyup', this.keyUpHandler.bind(this));
+ this.keyUpHandler = this.keyUpHandler.bind(this);
+ this.keyDownHandler = this.keyDownHandler.bind(this);
+ document.addEventListener('keydown', this.keyDownHandler);
+ document.addEventListener('keyup', this.keyUpHandler);
+ }
+
+ cleanup() {
+ clearInterval(this.interval);
+ document.removeEventListener('keydown', this.keyDownHandler);
+ document.removeEventListener('keyup', this.keyUpHandler);
}
clear() {
@@ -47,13 +75,34 @@ class Game {
}
updateGame() {
- if (this.keys.includes('s'))
- this.paddle.y += 3;
- if (this.keys.includes('w'))
- this.paddle.y -= 3;
+
+ if (this.keys.includes('Escape'))
+ this.cleanup();
+
+ if (this.keys.includes('s') &&
+ this.paddle.y + this.paddle.height < this.canvas.height - this.paddle.x)
+ this.paddle.y += this.paddle.speed;
+ if (this.keys.includes('w') &&
+ this.paddle.y > 0 + this.paddle.x)
+ this.paddle.y -= this.paddle.speed;
+
+ if (this.ball.x - this.ball.radius <= this.paddle.x + this.paddle.width
+ && (this.ball.y >= this.paddle.y && this.ball.y <= this.paddle.y + this.paddle.height))
+ this.ball.vx *= -1;
+ if (this.ball.x - this.ball.radius <= 0)
+ this.ball.vx *= -1;
+ else if (this.ball.x + this.ball.radius >= this.canvas.width)
+ this.ball.vx *= -1;
+ if (this.ball.y - this.ball.radius <= 0)
+ this.ball.vy *= -1;
+ else if (this.ball.y + this.ball.radius >= this.canvas.height)
+ this.ball.vy *= -1;
+ this.ball.x += this.ball.vx;
+ this.ball.y += this.ball.vy;
this.clear();
this.paddle.update();
+ this.ball.update();
}
keyUpHandler(ev) {
@@ -63,7 +112,7 @@ class Game {
}
keyDownHandler(ev) {
- if (this.keys.indexOf(ev.key) == -1)
+ if (!this.keys.includes(ev.key))
this.keys.push(ev.key);
}
}
@@ -74,6 +123,7 @@ class Paddle {
this.height = 70;
this.x = 5;
this.y = 100;
+ this.speed = 3;
this.ctx = context;
this.update();
}
@@ -83,3 +133,22 @@ class Paddle {
this.ctx.fillRect(this.x, this.y, this.width, this.height);
}
}
+
+class Ball {
+ constructor(context) {
+ this.radius = 5;
+ this.x = 240;
+ this.y = 135;
+ this.vx = 2;
+ this.vy = 2;
+ this.ctx = context;
+ this.update();
+ }
+
+ update() {
+ this.ctx.fillStyle = 'black';
+ this.ctx.beginPath();
+ this.ctx.arc(this.x, this.y, this.radius, 0, 2 * Math.PI);
+ this.ctx.fill();
+ }
+}