PHPackages                             masyasmv/otus\_moving\_objects - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. masyasmv/otus\_moving\_objects

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

masyasmv/otus\_moving\_objects
==============================

Moving / Rotating abstractions

v1.0.0(9mo ago)03PHPCI passing

Since Jul 15Pushed 9mo agoCompare

[ Source](https://github.com/MasyaSmv/otus_moving_objects)[ Packagist](https://packagist.org/packages/masyasmv/otus_moving_objects)[ RSS](/packages/masyasmv-otus-moving-objects/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (1)Dependencies (2)Versions (3)Used By (0)

otus\_moving\_objects
=====================

[](#otus_moving_objects)

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

Содержание
----------

[](#содержание)

- [Описание](#%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5)
- [Требования](#%D1%82%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
- [Установка](#%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0)
- [Структура проекта](#%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0)
- [Использование](#%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
- [Тестирование](#%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)
- [Статический анализ](#%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7)
- [Дальнейшее развитие](#%D0%B4%D0%B0%D0%BB%D1%8C%D0%BD%D0%B5%D0%B9%D1%88%D0%B5%D0%B5-%D1%80%D0%B0%D0%B7%D0%B2%D0%B8%D1%82%D0%B8%D0%B5)
- [Лицензия](#%D0%BB%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F)

Описание
--------

[](#описание)

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

- Прямолинейное равномерное движение объектов (`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

###  Health Score

27

—

LowBetter than 49% of packages

Maintenance56

Moderate activity, may be stable

Popularity3

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity37

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

298d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/f29a405df86487468d199f9525b44185d3bd3a81ccca962f75e0517a9ea44682?d=identicon)[MasyaSmv](/maintainers/MasyaSmv)

---

Top Contributors

[![MasyaSmv](https://avatars.githubusercontent.com/u/61746307?v=4)](https://github.com/MasyaSmv "MasyaSmv (28 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPsalm

Type Coverage Yes

### Embed Badge

![Health badge](/badges/masyasmv-otus-moving-objects/health.svg)

```
[![Health](https://phpackages.com/badges/masyasmv-otus-moving-objects/health.svg)](https://phpackages.com/packages/masyasmv-otus-moving-objects)
```

###  Alternatives

[wwwision/dcb-eventstore

Implementation of the Dynamic Consistency Boundary pattern described by Sara Pellegrini

2131.5k10](/packages/wwwision-dcb-eventstore)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
