masyasmv/otus_moving_objects

There is no license information available for the latest version (v1.0.0) of this package.

Moving / Rotating abstractions

v1.0.0 2025-07-15 20:41 UTC

This package is auto-updated.

Last update: 2025-07-30 20:15:10 UTC


README

Space Battle Server — учебный проект по лекции «Определение абстракций, устойчивых к изменениям требований» (Otus). Реализована логика движения и поворота игровых объектов (SOLID, адаптеры, полиморфизм).

Содержание

Описание

В проекте реализован серверный движок для игры «Космическая битва». Ключевые возможности:

  • Прямолинейное равномерное движение объектов (Mover) по вектору скорости.
  • Поворот объектов вокруг своей оси (Rotator) с учётом нормализации угла.
  • Архитектура на основе интерфейсов (Positionable, VelocityAware, Rotatable) и Value Object (Vector2D).
  • Тесты покрытия всего функционала (PHPUnit).
  • CI/CD: GitHub Actions (PHPUnit + Psalm).

Требования

  • PHP ≥ 8.3
  • Composer
  • PHPUnit
  • Psalm

Установка

  1. Клонировать репозиторий:

    git clone https://github.com/MasyaSmv/otus_moving_objects.git
    cd otus_moving_objects
  2. Установить зависимости:

    composer install

Структура проекта

├── src/                   # Исходный код
│   ├── Contract/          # Интерфейсы
│   ├── Service/           # Классы-реализации (Mover, Rotator)
│   └── ValueObject/       # Непосредственно Vector2D
├── tests/Unit/            # Unit-тесты
├── .github/workflows/ci.yml # CI-конфиг
├── composer.json          # Зависимости и автозагрузка
└── psalm.xml              # Конфиг статического анализатора

Использование

Пример использования Mover и Rotator:

use App\Service\Mover;
use App\Service\Rotator;
use App\Contract\Positionable;
use App\Contract\VelocityAware;
use App\Contract\Rotatable;
use App\ValueObject\Vector2D;

// Пример корабля:
class Ship implements Positionable, VelocityAware, Rotatable {
    use App\Trait\HasPosition;
    use App\Trait\HasVelocity;
    use App\Trait\HasAngle;

    public function __construct() {
        $this->setPosition(new Vector2D(0, 0));
        $this->velocity = new Vector2D(1, 0);
    }
}

$ship = new Ship();

$mover = new Mover();
$mover->move($ship);

$rotator = new Rotator();
$rotator->rotate($ship, 45);

Тестирование

Запуск всех тестов:

vendor/bin/phpunit --colors=always

Статический анализ

Запуск Psalm для проверки типов и качества кода:

vendor/bin/psalm --shepherd --stats

Лицензия

MIT © MasyaSmv