diff --git a/src/config.js b/src/config.js index c61245a..bd1abe1 100644 --- a/src/config.js +++ b/src/config.js @@ -18,3 +18,9 @@ export const BRICK_HEIGHT = 10; export const BRICK_ROW_AMOUNT = 5; export const BRICK_COLUMN_AMOUNT = 20; + +export const PERK_WIDTH = 16; +export const PERK_HEIGHT = 16; +export const PERK_FALL_SPEED = 3; +export const PERK_DROP_CHANCE = 0.3; +export const PERK_BALL_SPEED_DECREASE = 2; diff --git a/src/lib/spawnRandomPerk/spawnRandomPerk.js b/src/lib/spawnRandomPerk/spawnRandomPerk.js new file mode 100644 index 0000000..8d97713 --- /dev/null +++ b/src/lib/spawnRandomPerk/spawnRandomPerk.js @@ -0,0 +1,28 @@ +import { PERK_FALL_SPEED, PERK_HEIGHT, PERK_WIDTH } from '../../config'; +import { Perk } from '../../entities/perk/perk'; + +/** + * Типы бонусов + */ +const DROPPABLE_PERKS = ['slow']; + +/** + * Создает случайный бонус в заданной точке + * @param {number} x координата бонуса по оси X + * @param {number} y координата бонуса по оси Y + * @returns {Perk | null} + */ +export function spawnRandomPerk(x, y) { + try { + if (typeof x !== 'number' || typeof y !== 'number') { + throw new Error('Координаты бонуса должны являться числами'); + } + + const type = DROPPABLE_PERKS[Math.floor(Math.random() * DROPPABLE_PERKS.length)]; + + return new Perk(x, y, PERK_WIDTH, PERK_HEIGHT, type, PERK_FALL_SPEED); + } catch (err) { + console.error(err); + return null; + } +} diff --git a/src/lib/spawnRandomPerk/spawnRandomPerk.test.js b/src/lib/spawnRandomPerk/spawnRandomPerk.test.js new file mode 100644 index 0000000..1e42b82 --- /dev/null +++ b/src/lib/spawnRandomPerk/spawnRandomPerk.test.js @@ -0,0 +1,24 @@ +import { PERK_FALL_SPEED, PERK_HEIGHT, PERK_WIDTH } from '../../config'; +import { Perk } from '../../entities/perk/perk'; +import { spawnRandomPerk } from './spawnRandomPerk'; + +describe('spawnRandomPerk', () => { + it('Возвращает корректное значение при неверных типах аргументов', () => { + expect(spawnRandomPerk(null, 0)).toBeNull(); + expect(spawnRandomPerk(0, null)).toBeNull(); + expect(spawnRandomPerk('10', 0)).toBeNull(); + expect(spawnRandomPerk(0, undefined)).toBeNull(); + }); + + it('Создает бонус в заданной точке с размерами и скоростью из конфига', () => { + const perk = spawnRandomPerk(10, 20); + + expect(perk).toBeInstanceOf(Perk); + expect(perk.x).toBe(10); + expect(perk.y).toBe(20); + expect(perk.width).toBe(PERK_WIDTH); + expect(perk.height).toBe(PERK_HEIGHT); + expect(perk.fallSpeed).toBe(PERK_FALL_SPEED); + expect(perk.alive).toBe(true); + }); +});