tetris/js/main.js

64 lines
2.6 KiB
JavaScript

window.addEventListener("load", async function (){
const GAME_CONFIG ={
mainGrid:{width:10,height:20},
previewGrid:{width:6,height:6},
cellSize:30,
colors:["#CCCCCC", "red", "blue", "green", "yellow", "orange", "purple", "cyan", "#FAEBD7"],
}
const canvas = document.querySelector("#game-board");
const nextCanvas = document.querySelector("#next-piece-board");
const uiLvl = document.querySelector("#level");
const uiLines = document.querySelector("#lines");
const uiScore = document.querySelector("#score");
const startButton = document.querySelector("#start-button");
const overlay = document.querySelector("#game-overlay");
const eventBus = new EventBus();
const render = new Renderer(canvas, nextCanvas, eventBus, GAME_CONFIG.cellSize, GAME_CONFIG.colors);
new UIManager(eventBus, overlay, startButton, uiLvl, uiLines, uiScore);
new AnimationManager(eventBus);
new InputHandler(eventBus);
////////////////////////////////////////////
let game = null;
let isAnimating = false;
function gameInit(){
const grid = new Grid(GAME_CONFIG.mainGrid.width, GAME_CONFIG.mainGrid.height);
const previewGrid = new Grid(GAME_CONFIG.previewGrid.width, GAME_CONFIG.previewGrid.height);
const pieceFactory = new PieceFactory();
const game = new Game(eventBus, grid, previewGrid, pieceFactory);
eventBus.emit("render", game.getRenderState());
return game;
}
function gameStart(){
if(isAnimating) return;
//Я подпишусь на эту функцию в EventBus. Событие будет вызываться при клавише пробел
if (game) {
window.cancelAnimationFrame(game.loopRequestID);
game.unSetupInputListeners();
game.unsubscribleStartGameplay();
game.unsubscribleStopGameplay();
//game.unSetupInputListeners() // <-- ГЛАВНОЕ: УДАЛЕНИЕ СЛУШАТЕЛЕЙ СТАРОЙ ИГРЫ
}
game = gameInit()
game.start();
}
function gameEnd(){
if (game) {
game.unSetupInputListeners();
game.unsubscribleStartGameplay();
game.unsubscribleStopGameplay();
window.cancelAnimationFrame(game.loopRequestID);
eventBus.emit("showGameOver", game.uiState())
}
}
eventBus.on("set-is-animating", ({state})=>{
isAnimating = state;
});
eventBus.on("gameEnd", gameEnd);
eventBus.on("gameStart", gameStart);
game = gameInit();
})