Files
arkanoid/src/lib/updatePerks/updatePerks.js
T

75 lines
2.5 KiB
JavaScript
Raw Normal View History

import { CONTAINER_WIDTH, PADDLE_WIDE_WIDTH, PERK_BALL_SPEED_DECREASE } from '../../config';
import { Game } from '../../game';
import { calculateCollision } from '../calculateCollision/calculateCollision';
/**
* Обновляет состояние бонусов, меняет положение, проверяет столкновение с ракеткой и выход за границу поля
* @param {Game} game экземпляр класса игры
* @param {number} containerHeight высота игрового контейнера в пикселях
* @param {number} deltaTime изменение времени из Ticker
*/
export function updatePerks(game, containerHeight, deltaTime) {
try {
if (!(game instanceof Game)) {
throw new Error('Аргумент game должен быть экземпляром класса игры');
}
if (typeof containerHeight !== 'number' || containerHeight <= 0) {
throw new Error('Высота игрового контейнера должна быть положительным числом');
}
if (typeof deltaTime !== 'number' || deltaTime <= 0) {
throw new Error('Значение изменения времени должно быть положительным числом');
}
const { paddle } = game;
for (const perk of game.perks) {
perk.moveForward(deltaTime);
const perkObject = {
left: perk.x,
right: perk.x + perk.width,
top: perk.y,
bottom: perk.y + perk.height,
};
const paddleObject = {
left: paddle.x,
right: paddle.x + paddle.width,
top: paddle.y,
bottom: paddle.y + paddle.height,
};
const isCollided = calculateCollision(perkObject, paddleObject);
if (isCollided) {
switch (perk.type) {
case 'slow':
if (game.ball.speed - PERK_BALL_SPEED_DECREASE > 0) {
game.ball.increaseSpeed(-1 * PERK_BALL_SPEED_DECREASE);
}
break;
case 'wide':
paddle.width = PADDLE_WIDE_WIDTH;
paddle.moveTo(paddle.x, 0, CONTAINER_WIDTH);
break;
case 'life':
game.livesAmount += 1;
break;
default:
break;
}
perk.alive = false;
} else if (perk.y > containerHeight) {
perk.alive = false;
}
}
game.perks = game.perks.filter((perk) => perk.alive);
} catch (err) {
console.error(err);
return null;
}
}