Feature/advanced game mechanics #5

Merged
ilia merged 30 commits from feature/advanced-game-mechanics into main 2026-07-19 15:09:22 +00:00
6 changed files with 16 additions and 18 deletions
Showing only changes of commit d2cfee3ec3 - Show all commits
@@ -12,7 +12,7 @@
* @param {number} secondObject.bottom - Max Y координата второго объекта
* @returns {boolean}
*/
export function calculateCollision(firstObject, secondObject) {
export function calculateAABBCollision(firstObject, secondObject) {
try {
const coordinates = [
firstObject.left,
@@ -1,6 +1,6 @@
import { calculateCollision } from './calculateCollision';
import { calculateAABBCollision } from './calculateAABBCollision';
describe('calculateCollision', () => {
describe('calculateAABBCollision', () => {
it('Корректно обрабатывает невозможные кейсы (левая координата больше правой)', () => {
const firstObject = {
left: 0,
@@ -16,7 +16,7 @@ describe('calculateCollision', () => {
bottom: 10,
};
expect(calculateCollision(firstObject, secondObject)).toBeNull();
expect(calculateAABBCollision(firstObject, secondObject)).toBeNull();
});
it('Корректно обрабатывает неверный формат данных', () => {
@@ -34,7 +34,7 @@ describe('calculateCollision', () => {
bottom: 10,
};
expect(calculateCollision(firstObject, secondObject)).toBeNull();
expect(calculateAABBCollision(firstObject, secondObject)).toBeNull();
});
it('Корректно обрабатывает отсутствие пересечения по X', () => {
@@ -52,7 +52,7 @@ describe('calculateCollision', () => {
bottom: 10,
};
expect(calculateCollision(firstObject, secondObject)).toBe(false);
expect(calculateAABBCollision(firstObject, secondObject)).toBe(false);
});
it('Корректно обрабатывает отсутствие пересечения по Y', () => {
@@ -70,7 +70,7 @@ describe('calculateCollision', () => {
bottom: 30,
};
expect(calculateCollision(firstObject, secondObject)).toBe(false);
expect(calculateAABBCollision(firstObject, secondObject)).toBe(false);
});
it('Корректно обрабатывает отсутствие пересечения по X и Y', () => {
@@ -88,7 +88,7 @@ describe('calculateCollision', () => {
bottom: 30,
};
expect(calculateCollision(firstObject, secondObject)).toBe(false);
expect(calculateAABBCollision(firstObject, secondObject)).toBe(false);
});
it('Корректно обрабатывает пересечение', () => {
@@ -106,7 +106,7 @@ describe('calculateCollision', () => {
bottom: 30,
};
expect(calculateCollision(firstObject, secondObject)).toBe(true);
expect(calculateAABBCollision(firstObject, secondObject)).toBe(true);
});
it('Корректно обрабатывает вхождение', () => {
@@ -124,6 +124,6 @@ describe('calculateCollision', () => {
bottom: 15,
};
expect(calculateCollision(firstObject, secondObject)).toBe(true);
expect(calculateAABBCollision(firstObject, secondObject)).toBe(true);
});
});
@@ -1,4 +1,4 @@
import { calculateCollision } from '../calculateCollision/calculateCollision';
import { calculateAABBCollision } from '../calculateAABBCollision/calculateAABBCollision';
/**
* Вычисляет направление наибольшего пересечения по осям и возвращает tuple множителей для изменения координат
@@ -17,7 +17,7 @@ import { calculateCollision } from '../calculateCollision/calculateCollision';
export function calculateDirection(firstObject, secondObject) {
try {
// Запускаем для проверки формата аргументов
const isCollided = calculateCollision(firstObject, secondObject);
const isCollided = calculateAABBCollision(firstObject, secondObject);
if (isCollided === null) {
return null;
+2 -2
View File
@@ -9,7 +9,7 @@ import {
PERK_WIDTH,
} from '../../config';
import { Game } from '../../game';
import { calculateCollision } from '../calculateCollision/calculateCollision';
import { calculateAABBCollision } from '../calculateAABBCollision/calculateAABBCollision';
import { calculateDirection } from '../calculateDirection/calculateDirection';
import { processReflection } from '../processReflection/processReflection';
import { spawnRandomPerk } from '../spawnRandomPerk/spawnRandomPerk';
@@ -91,7 +91,7 @@ export function tick(game, containerWidth, containerHeight, deltaTime) {
const ballObject = { left: ballLeft, right: ballRight, top: ballTop, bottom: ballBottom };
const brickObject = { left: brickLeft, right: brickRight, top: brickTop, bottom: brickBottom };
const isCollided = calculateCollision(ballObject, brickObject);
const isCollided = calculateAABBCollision(ballObject, brickObject);
if (isCollided) {
const directions = calculateDirection(ballObject, brickObject);
+2 -2
View File
@@ -1,6 +1,6 @@
import { CONTAINER_WIDTH, PADDLE_WIDE_WIDTH, PERK_BALL_SPEED_DECREASE } from '../../config';
import { Game } from '../../game';
import { calculateCollision } from '../calculateCollision/calculateCollision';
import { calculateAABBCollision } from '../calculateAABBCollision/calculateAABBCollision';
/**
* Обновляет состояние бонусов, меняет положение, проверяет столкновение с ракеткой и выход за границу поля
@@ -40,7 +40,7 @@ export function updatePerks(game, containerHeight, deltaTime) {
bottom: paddle.y + paddle.height,
};
const isCollided = calculateCollision(perkObject, paddleObject);
const isCollided = calculateAABBCollision(perkObject, paddleObject);
if (isCollided) {
switch (perk.type) {
-2
View File
@@ -15,8 +15,6 @@ import {
} from './config';
import { LEVELS } from './const/levels';
import { Game } from './game';
import { calculateCollision } from './lib/calculateCollision/calculateCollision';
import { calculateDirection } from './lib/calculateDirection/calculateDirection';
import { createGameView, managePerkViewsLifetime, rebuildBrickViews, syncronizeViewsWithGame } from './view';
(async () => {