68 lines
2.2 KiB
JavaScript
68 lines
2.2 KiB
JavaScript
import { 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;
|
||
|
|
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;
|
||
|
|
}
|
||
|
|
}
|