-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
137 lines (108 loc) · 3.91 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import { LEVEL, OBJECT_TYPE } from './setup';
import { randomMovement } from './ghostMove';
// Classes
import GameBoard from './GameBoard';
import Pacman from './Pacman';
import Ghost from './Ghosts';
// Sounds
import soundDot from './sounds/munch.wav';
import soundPill from './sounds/pill.wav';
import soundGameStart from './sounds/game_start.wav';
import soundGameOver from './sounds/death.wav';
import soundGhost from './sounds/eat_ghost.wav';
// DOM Elements
const gameGrid = document.querySelector('#game');
const scoreTable = document.querySelector('#score');
const startButton = document.querySelector('#start-button');
// Game Constants
const POWER_PILL_TIME = 10000; // ms
const GLOBAL_SPEED = 80; // ms
const gameBoard = GameBoard.createGameBoard(gameGrid, LEVEL);
// Initial Setup
let score = 0 ;
let timer = null;
let gameWin = false;
let PowerPillActive = false;
let PowerPillTimer = null;
function gameOver(pacman, grid) {
playAudio(soundGameOver);
document.removeEventListener('keydown', e => pacman.handleKeyInput(e, gameBoard.objectExist));
gameBoard.showGameStatus(gameWin);
clearInterval(timer);
startButton.classList.remove('hide');
}
function checkCollision(pacman, ghosts) {
const collidedGhost = ghosts.find( ghost => pacman.pos === ghost.pos);
if(collidedGhost) {
// pacman eats ghost
if(pacman.powerPill) {
playAudio(soundGhost);
gameBoard.removeObject(collidedGhost.pos, [ OBJECT_TYPE.GHOST, OBJECT_TYPE.SCARED, collidedGhost.name]);
collidedGhost.pos = collidedGhost.startPos;
score +=100;
} else {
gameBoard.removeObject(pacman.pos, [OBJECT_TYPE.PACMAN]);
gameBoard.rotateDiv(pacman.pos, 0);
gameOver(pacman, gameGrid);
}
}
}
function gameLoop(pacman, ghosts) {
gameBoard.moveCharacter(pacman);
checkCollision(pacman, ghosts);
ghosts.forEach((ghost) => gameBoard.moveCharacter(ghost));
checkCollision(pacman, ghosts);
// Check if Pacman eats a dot
if (gameBoard.objectExist(pacman.pos, OBJECT_TYPE.DOT)) {
playAudio(soundDot);
gameBoard.removeObject(pacman.pos, [OBJECT_TYPE.DOT]);
gameBoard.dotCount--;
score +=10;
}
// Check if Pacman eats a powerpill
if (gameBoard.objectExist(pacman.pos, OBJECT_TYPE.PILL)) {
playAudio(soundPill);
gameBoard.removeObject(pacman.pos, [OBJECT_TYPE.PILL]);
pacman.powerPill = true;
score += 50;
clearTimeout(PowerPillTimer);
PowerPillTimer = setTimeout(() => (pacman.powerPill = false), POWER_PILL_TIME );
}
// Change ghost scare mode depening on Powerpill
if (pacman.powerPill !== PowerPillActive) {
PowerPillActive = pacman.powerPill;
ghosts.forEach((ghost) => (ghost.isScared = pacman.powerPill));
}
// check if all dots have been eaten
if (gameBoard.dotCount === 0) {
gameWin = true;
gameOver(pacman, ghosts);
}
// Show the score
scoreTable.innerHTML = score;
}
// Audio
function playAudio(audio) {
const soundEffect = new Audio(audio);
soundEffect.play();
}
function startGame() {
playAudio(soundGameStart);
gameWin = false;
PowerPillActive = false;
score = 0;
startButton.classList.add('hide');
gameBoard.createGrid(LEVEL);
const pacman = new Pacman(2, 287);
gameBoard.addObject(287, [OBJECT_TYPE.PACMAN]);
document.addEventListener('keydown', (e) => pacman.handleKeyInput(e, gameBoard.objectExist));
const ghosts = [
new Ghost(5, 188, randomMovement, OBJECT_TYPE.BLINKY),
new Ghost(4, 209, randomMovement, OBJECT_TYPE.PINKY),
new Ghost(3, 230, randomMovement, OBJECT_TYPE.INKY),
new Ghost(2, 251, randomMovement, OBJECT_TYPE.CLYDE)
]
timer = setInterval(() => gameLoop(pacman, ghosts), GLOBAL_SPEED);
}
// Initialize Game
startButton.addEventListener('click', startGame);