Files
arkanoid/src/game.js
T

87 lines
2.5 KiB
JavaScript
Raw Normal View History

import {
BALL_INITIAL_ANGLE,
BALL_RADIUS,
BALL_SPEED,
BRICK_HEIGHT,
BRICK_WIDTH,
CONTAINER_HEIGHT,
CONTAINER_WIDTH,
PADDLE_HEIGHT,
PADDLE_WIDTH,
} from './config';
import { Ball } from './entities/ball/ball';
import { layBricks } from './entities/brick/layBricks/layBricks';
import { Paddle } from './entities/paddle/paddle';
2026-07-18 10:18:38 +03:00
import { tick } from './lib/tick/tick';
import { toRadians } from './lib/toRadians/toRadians';
/**
* Класс игры c информацией о всех игровых сущностях
*/
export class Game {
/**
* @param {number[][][]} levels список уровней, каждый элемент которого - карта расположения блоков
*/
constructor(levels) {
this.livesAmount = 3;
this.status = 'in_process';
this.levels = levels;
this.currentLevel = 0;
this.maxLevel = levels.length - 1;
this.ball = new Ball(
CONTAINER_WIDTH / 2 - BALL_RADIUS / 2,
CONTAINER_HEIGHT / 2 - BALL_RADIUS / 2,
BALL_RADIUS,
BALL_SPEED * Math.cos(toRadians(BALL_INITIAL_ANGLE)),
-1 * BALL_SPEED * Math.sin(toRadians(BALL_INITIAL_ANGLE)),
);
this.paddle = new Paddle(0, CONTAINER_HEIGHT - PADDLE_HEIGHT, PADDLE_WIDTH, PADDLE_HEIGHT);
this.bricks = layBricks(this.levels[this.currentLevel], BRICK_WIDTH, BRICK_HEIGHT);
}
/**
* Изменяет значения сущностей в зависимости от времени
* @param {*} deltaTime изменение времени из Ticker
*/
update(deltaTime) {
if (this.status !== 'in_process') {
return;
}
tick(this, CONTAINER_WIDTH, CONTAINER_HEIGHT, deltaTime);
if (this.ball.isOut) {
this.livesAmount -= 1;
if (this.livesAmount === 0) {
this.status = 'over';
} else {
this.ball.reset();
}
return;
}
const isAnyBrickAlive = this.bricks.some((brick) => brick.alive);
if (!isAnyBrickAlive) {
this.currentLevel += 1;
if (this.currentLevel <= this.maxLevel) {
this._proceedToNextLevel();
} else {
this.status = 'completed';
}
}
}
/**
* Запускает переход на новый уровень, возвращает мяч в дефоотное положение и отрисовывает кирпичи по карте уровня.
*/
_proceedToNextLevel() {
this.ball.reset();
this.bricks = layBricks(this.levels[this.currentLevel], BRICK_WIDTH, BRICK_HEIGHT);
}
}