73 lines
2.5 KiB
Markdown
73 lines
2.5 KiB
Markdown
# Lab 3 — Wormz (мини-игра на OLED + FreeRTOS)
|
||
|
||
**Автор:** А. Карпов P3313
|
||
|
||
## 1. Цель работы
|
||
|
||
Реализовать простую игру на OLED 128×64:
|
||
- 2 игрока (червя)
|
||
- прицеливание, сила выстрела, полёт с гравитацией/ветром
|
||
- взрыв с кратером и уроном по радиусу
|
||
- завершение игры при 0 HP
|
||
|
||
## 2. Аппаратная часть
|
||
|
||
**МК:** STM32F407VGTx
|
||
**Периферия:**
|
||
- OLED по I2C
|
||
- Клавиатура (сканирование строк/столбцов через PCA9538 / kb.c)
|
||
- FreeRTOS
|
||
|
||
## 3. Управление
|
||
|
||
- `2` — угол вверх
|
||
- `8` — угол вниз
|
||
- `4` — влево
|
||
- `6` — вправо
|
||
- `5` — FIRE: 1-е нажатие заряд силы, 2-е нажатие выстрел
|
||
- `*` — следующее оружие (в режиме прицеливания)
|
||
- `#` — предыдущее оружие (в режиме прицеливания)
|
||
- `0` — рестарт
|
||
|
||
## 4. Архитектура и состояние игры
|
||
|
||
Основные состояния (`GameState`):
|
||
- `GS_AIM` — прицеливание/движение/выбор оружия
|
||
- `GS_CHARGE` — заряд силы
|
||
- `GS_FLIGHT` — полёт снаряда
|
||
- `GS_EXPLOSION` — анимация взрыва + кратер + урон
|
||
- `GS_GAMEOVER` — конец игры
|
||
|
||
```mermaid
|
||
stateDiagram-v2
|
||
[*] --> AIM
|
||
|
||
AIM --> CHARGE: FIRE (5)
|
||
CHARGE --> FLIGHT: FIRE (5)
|
||
FLIGHT --> EXPLOSION: collision/hit
|
||
EXPLOSION --> AIM: next player
|
||
EXPLOSION --> GAMEOVER: hp == 0
|
||
|
||
GAMEOVER --> AIM: restart (0)
|
||
AIM --> AIM: restart (0)
|
||
CHARGE --> AIM: restart (0)
|
||
FLIGHT --> AIM: restart (0)
|
||
EXPLOSION --> AIM: restart (0)
|
||
```
|
||
|
||
## 5. Модель мира
|
||
|
||
* Земля: массив `ground_y[x]` (высота поверхности по X).
|
||
* Кратер: “опускаем” `ground_y[x]` в радиусе взрыва.
|
||
* Урон: линейно убывает с расстоянием до эпицентра.
|
||
|
||
## 6. Демо (небольшое)
|
||
|
||

|
||
|
||
## 7. Выводы
|
||
|
||
* Сделан игровой цикл со стабильным FPS (фиксированный шаг).
|
||
* Реализованы физика полёта, взрыв, деформация ландшафта и урон.
|
||
* Игра управляется только клавиатурой и выводится на OLED.
|