This repository has been archived on 2024-09-11. You can view files and clone it, but cannot push or open issues or pull requests.
Files
IT2/html/tasks/chapter_10/snake/script.js
2020-03-31 14:04:46 +02:00

138 lines
3.3 KiB
JavaScript
Executable File

// @ts-check
/* Initialize variables */
const pixelSize = 20; //Cannot be odd
const pixelAmount = 30;
/* Register HTML DOM elements by variables */
const canvas = document.getElementById('game');
const game = canvas.getContext('2d');
const startButton = document.getElementById('start');
/* Add event listeners */
document.addEventListener('keydown', updateDirection, false);
startButton.addEventListener('click', gameLoop, false);
/* Initialize HTML */
canvas.style.display = 'block';
game.canvas.width = game.canvas.height = pixelSize * pixelAmount;
canvas.style.backgroundColor = '#ffffff';
/* Snake object */
const snake = {
speed: 5, //in FPS
direction: 'right',
color: '#00ff00',
tail: [
[3, 0],
[2, 0],
[1, 0],
[0, 0],
],
/* Draw the snake by the tail array */
draw() {
game.fillStyle = this.color;
for (let tailPoint = 0; tailPoint < this.tail.length; tailPoint++) {
/* Correct tailpoint x and y to actual size */
const realPosition = this.tail[tailPoint].map(point => point * pixelSize);
game.fillRect(realPosition[0], realPosition[1], pixelSize, pixelSize);
}
},
/* Generate the next tail array */
updateTail() {
const realPosition = this.tail.pop().map(point => point * pixelSize);
game.clearRect(realPosition[0], realPosition[1], pixelSize, pixelSize);
switch (this.direction) {
case 'left':
this.tail.unshift([this.tail[0][0] - 1, this.tail[0][1]]);
break;
case 'right':
this.tail.unshift([this.tail[0][0] + 1, this.tail[0][1]]);
break;
case 'up':
this.tail.unshift([this.tail[0][0], this.tail[0][1] - 1]);
break;
case 'down':
this.tail.unshift([this.tail[0][0], this.tail[0][1] + 1]);
break;
}
},
};
/* Apple object */
const apple = {
position: [20, 20],
color: 'red',
/* Generate new coordinates */
generate() {
this.position.map(() => Math.floor(Math.random() * pixelAmount));
},
/* Draw the apple */
draw() {
const realPosition = this.position.map(point => point * pixelSize);
game.fillStyle = this.color;
game.fillRect(realPosition[0], realPosition[1], pixelSize, pixelSize);
},
};
/* Wrapper function for gameloop */
function gameLoop() {
/* Slow down loop by snake speed*/
setTimeout(() => {
window.requestAnimationFrame(gameLoop);
gameUpdate();
}, 1000 / snake.speed);
}
/* Function that is being run each tick */
function gameUpdate() {
/* Draw snake */
snake.draw();
snake.updateTail();
if (snake.tail[0] === apple.position) {
}
}
/* Update direction for snake */
function updateDirection(evt) {
const key = evt.code;
console.debug(`Pressed %c${key}`, 'color: red');
switch (key) {
case 'ArrowLeft':
evt.preventDefault();
if (snake.direction !== 'right') {
snake.direction = 'left';
}
break;
case 'ArrowRight':
evt.preventDefault();
if (snake.direction !== 'left') {
snake.direction = 'right';
}
break;
case 'ArrowUp':
evt.preventDefault();
if (snake.direction !== 'down') {
snake.direction = 'up';
}
break;
case 'ArrowDown':
evt.preventDefault();
if (snake.direction !== 'up') {
snake.direction = 'down';
}
break;
}
}