Skip to content

Commit 3f6da1b

Browse files
v1.2.1
1 parent 2203fa1 commit 3f6da1b

79 files changed

Lines changed: 3590 additions & 2362 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,30 @@
1313
- Система частиц
1414
- Мобильная поддержка
1515

16+
## [1.2.1]
17+
18+
### Added
19+
- 🧭 **Debug HUD**: FPS и координаты камеры
20+
- 🧾 **Логи**: уровни (info/warning/error/custom), источник вызова, запись в файл
21+
- 🖱️ **Debug camera input**: управление камерой кнопкой мыши (или None)
22+
-**Sprite.anchor**: смена якоря без смещения позиции
23+
- 📄 **Pages API**: страницы умеют управлять спрайтами
24+
- 🎮 **EventBus Demo**: показ подписки на события и таймеры
25+
- 📣 **Стартовый лог**: приветственное сообщение с ссылкой на репозиторий
26+
27+
### Changed
28+
- 🧩 **Debug overlay**: сетка и HUD могут рисоваться поверх или под сценой
29+
- 🧭 **Сетка**: шаг 100 по умолчанию, подписи во всех ячейках
30+
- 🛠️ **Шаблон проекта**: debug включён по умолчанию, стартовый лог
31+
- 🔧 **Anchor/FillDirection**: переведены на Enum без поломки старого API
32+
- 🧩 **Pages demo**: сцены и страницы с авто-спрайтами
33+
- 📚 **README**: полный список ссылок на всю документацию
34+
- 🧪 **Reactive example**: добавлен пример с Blinker
35+
36+
### Fixed
37+
- 🏓 **Ping Pong**: очки начисляются корректной стороне
38+
- 🖼️ **Sprite.set_image**: пустая строка не вызывает предупреждение
39+
1640
## [1.2.0] - 2026-01-18
1741

1842
### Added

DOCUMENTATION_INDEX.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@
9595
- Колбэки начала/конца
9696
- Возврат на место
9797

98+
#### [docs/pages.md](docs/pages.md)
99+
**Pages**
100+
- Страницы и менеджер страниц
101+
- Автовключение/выключение спрайтов
102+
98103
### Игровые системы
99104

100105
#### [docs/animation.md](docs/animation.md)
@@ -258,6 +263,7 @@
258263
- [docs/game_loop.md](docs/game_loop.md)
259264
- [docs/input.md](docs/input.md)
260265
- [docs/debug.md](docs/debug.md)
266+
- [docs/pages.md](docs/pages.md)
261267

262268
#### 📋 Планирование и разработка
263269
- [ROADMAP.md](ROADMAP.md)

README.md

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -465,17 +465,20 @@ python spritePro/demoGames/ping_pong.py
465465
### 🚀 Быстрый старт
466466
- [Установка и настройка](#-быстрый-старт-30-секунд)
467467
- [Базовый пример](#ваша-первая-игра-5-строк)
468-
469-
### 📚 Полная документация
470-
- [📖 Индекс документации](DOCUMENTATION_INDEX.md) - Все модули и компоненты
471-
- [🎮 Sprite](docs/sprite.md) - Базовый класс спрайта
472-
- [🎨 UI компоненты](docs/button.md) - Кнопки, переключатели, текст
473-
- [🎬 Анимации](docs/animation.md) - Система анимаций
474-
- [✨ Tweening](docs/tween.md) - Плавные переходы
475-
- [💥 Частицы](docs/particles.md) - Система частиц
476-
- [🎵 Аудио](docs/audio.md) - AudioManager
477-
- [💾 Сохранения](docs/save_load.md) - PlayerPrefs
478-
- [📊 Полосы прогресса](docs/bar.md) - Bar компоненты
468+
- [Быстрый старт 2.0](#-быстрый-старт-20-шаблон-проекта)
469+
470+
### 📚 Индексы
471+
- [📖 Индекс документации](DOCUMENTATION_INDEX.md) - Полный список модулей
472+
- [📘 Документация папки docs](docs/README.md) - Навигация по разделам
473+
474+
### 🧩 Полный список документации
475+
- Основы: [Game Loop](docs/game_loop.md) • [Input](docs/input.md) • [Debug](docs/debug.md) • [Camera & Particles](docs/camera_and_particles.md)
476+
- Спрайты и графика: [Sprite](docs/sprite.md) • [Surface](docs/surface.md) • [Text](docs/text.md) • [Text FPS](docs/text_fps.md) • [Color Effects](docs/color_effects.md) • [ReadySprites](docs/readySprites.md)
477+
- UI: [Button](docs/button.md) • [Toggle Button](docs/toggle_button.md) • [Bar](docs/bar.md) • [Bar Background](docs/bar_background.md) • [Pages](docs/pages.md)
478+
- Компоненты: [Animation](docs/animation.md) • [Tween](docs/tween.md) • [Timer](docs/timer.md) • [Health](docs/health.md) • [Mouse Interactor](docs/mouse_interactor.md) • [Draggable Sprite](docs/draggable_sprite.md)
479+
- Эффекты и частицы: [Particles](docs/particles.md)
480+
- Аудио: [Audio](docs/audio.md)
481+
- Сохранения и утилиты: [Save/Load](docs/save_load.md)
479482
480483
---
481484

create_project.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def on_enter(self, context):
1616
def update(self, dt):
1717
self.player.handle_keyboard_input()
1818
if s.input.was_pressed(pygame.K_SPACE):
19-
print("Space pressed")
19+
s.debug_log_info("Space pressed")
2020
2121
2222
def main():
@@ -52,7 +52,9 @@ def main() -> None:
5252
args = parser.parse_args()
5353

5454
create_project(Path(args.name))
55-
print(f"Project created at: {Path(args.name).resolve()}")
55+
import logging
56+
logging.basicConfig(level=logging.INFO, format="%(message)s")
57+
logging.info("Project created at: %s", Path(args.name).resolve())
5658

5759

5860
if __name__ == "__main__":

demo_game_new_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def on_enter(self, context):
99
def update(self, dt):
1010
self.player.handle_keyboard_input()
1111
if s.input.was_pressed(pygame.K_SPACE):
12-
print("Space pressed")
12+
s.debug_log_info("Space pressed")
1313

1414

1515
def main():

docs/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ SpritePro состоит из нескольких основных модуле
2828
#### [DraggableSprite](draggable_sprite.md)
2929
Drag-and-drop компонент на базе Sprite с колбэками и возвратом на место.
3030

31+
#### [Pages](pages.md)
32+
Система страниц (Page/PageManager) для UI и экранов внутри сцены.
33+
3134
### Игровые системы
3235

3336
#### [Animation](animation.md)
@@ -92,6 +95,7 @@ InputState в стиле Unity и EventBus для подписки на собы
9295
- [Timer](timer.md) - Управление временем
9396
- [Health](health.md) - Система здоровья
9497
- [Debug Overlay](debug.md) - Отладочная сетка и логи
98+
- [Pages](pages.md) - Страницы и менеджер страниц
9599

96100
**Вспомогательные инструменты:**
97101
- [Surface](surface.md) - Операции с поверхностями

docs/debug.md

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
# Debug Overlay
22

3-
Debug Overlay — встроенная визуализация для разработки: сетка мира, координаты камеры и отладочные логи.
3+
Debug Overlay — встроенная визуализация для разработки: сетка мира, координаты камеры/точки/мыши, HUD и отладочные логи.
44

55
## Быстрый старт
66

77
```python
88
import spritePro as s
99

1010
s.enable_debug(True)
11-
s.set_debug_grid(size=80, label_every=2)
11+
s.set_debug_grid(size=100, label_every=1)
1212
s.set_debug_log_anchor("bottom_left")
1313
s.debug_log_info("Debug enabled")
1414
```
1515

1616
## Возможности
1717

18-
- Сетка мира (не привязана к камере)
19-
- Координаты камеры и точка в центре экрана
20-
- Логи в углу экрана с авто‑исчезновением
18+
- Сетка мира (можно поверх/под сценой)
19+
- HUD с координатами камеры и FPS
20+
- Координаты точки центра и позиции мыши в мире
21+
- Логи в углу экрана с авто‑исчезновением и записью в файл
2122

2223
## API (через spritePro)
2324

@@ -35,7 +36,7 @@ s.debug_log_info("Debug enabled")
3536
- `s.set_debug_log_anchor("top_left" | "top_right" | "bottom_left" | "bottom_right")`
3637

3738
### Сетка
38-
- `s.set_debug_grid(size=None, color=None, alpha=None, label_every=None, label_color=None, labels_enabled=None)`
39+
- `s.set_debug_grid(size=None, color=None, alpha=None, label_every=None, label_color=None, labels_enabled=None, label_limit=None, label_font_size=None, on_top=None)`
3940
- `s.set_debug_grid_enabled(True/False)`
4041

4142
### Стиль и файл логов
@@ -45,20 +46,22 @@ s.debug_log_info("Debug enabled")
4546
- `s.set_debug_log_palette(info=None, warning=None, error=None)`
4647
- `s.set_debug_log_prefixes(info=None, warning=None, error=None)`
4748
- `s.set_debug_log_stack_enabled(True/False)`
48-
- `s.set_debug_hud_style(font_size=None, color=None, padding=None, anchor=None)`
49+
- `s.set_console_log_enabled(True/False)`
50+
- `s.set_debug_hud_style(font_size=None, color=None, padding=None, anchor=None, on_top=None)`
4951
- `s.set_debug_hud_enabled(show_fps=None, show_camera=None)`
5052
- `s.set_debug_camera_input(mouse_button)`
5153

5254
## Параметры сетки
5355

5456
```python
5557
s.set_debug_grid(
56-
size=64, # шаг сетки
58+
size=100, # шаг сетки
5759
color=(80, 80, 80), # цвет линий
5860
alpha=120, # прозрачность (0..255)
59-
label_every=2, # подписи через N линий
61+
label_every=1, # подписи через N линий
6062
label_color=(140, 140, 140),
6163
labels_enabled=True,
64+
on_top=False, # рисовать поверх сцены
6265
)
6366
```
6467

docs/input.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,16 @@ def on_quit(event):
4444
def on_key_down(key, event):
4545
print("Key down:", key)
4646

47-
s.events.on("quit", on_quit)
48-
s.events.on("key_down", on_key_down)
47+
s.events.connect("quit", on_quit)
48+
s.events.connect("key_down", on_key_down)
4949
```
5050

51+
Полезные методы:
52+
- `connect(event_name, handler)`
53+
- `disconnect(event_name, handler=None)`
54+
- `send(event_name, **payload)`
55+
- `disconnect_all(event_name=None)`
56+
5157
Доступные события:
5258
- `quit`
5359
- `key_down`, `key_up`

docs/pages.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# Pages
2+
3+
`Page` и `PageManager` — лёгкая система экранов внутри сцены.
4+
Страница хранит список спрайтов и сама включает/выключает их без лишнего кода.
5+
6+
## Быстрый старт
7+
8+
```python
9+
import spritePro as s
10+
11+
class MenuPage(s.Page):
12+
def __init__(self, scene=None):
13+
super().__init__("menu", scene=scene)
14+
self.add_sprite(s.TextSprite("Menu", 48, pos=(400, 40), scene=scene))
15+
self.add_sprite(s.Button(text="Start", pos=(400, 300)))
16+
17+
class GamePage(s.Page):
18+
def __init__(self, scene=None):
19+
super().__init__("game", scene=scene)
20+
self.add_sprite(s.TextSprite("Game", 48, pos=(400, 40), scene=scene))
21+
22+
class PagesScene(s.Scene):
23+
def __init__(self):
24+
super().__init__()
25+
self.pages = s.PageManager(scene=self)
26+
self.pages.add_page(MenuPage(scene=self))
27+
self.pages.add_page(GamePage(scene=self))
28+
self.pages.set_active_page("menu")
29+
30+
def update(self, dt):
31+
self.pages.update()
32+
```
33+
34+
## API
35+
36+
### Page
37+
- `Page(name, scene=None)` — создаёт страницу.
38+
- `set_active(True/False)` — включает/выключает страницу (спрайты тоже).
39+
- `add_sprite(sprite, use_scene=True)` — добавляет спрайт на страницу.
40+
- `add_sprites(*sprites, use_scene=True)` — добавить несколько спрайтов.
41+
- `remove_sprite(sprite)` — удалить спрайт со страницы.
42+
- `is_active()` — активна ли страница.
43+
44+
### PageManager
45+
- `PageManager(scene=None)` — менеджер страниц.
46+
- `add_page(page)` — добавить страницу.
47+
- `set_active_page(name)` — активировать страницу.
48+
- `get_active_page()` — активная страница.
49+
- `set_scene(scene)` — назначить сцену всем страницам.
50+
- `update()` — обновить активную страницу.
51+
52+
## Примечания
53+
- Если `scene` задана, `add_sprite()` автоматически привяжет спрайт к этой сцене.
54+
- Страницы можно использовать и без сцен — тогда просто управляется активность спрайтов.

docs/particles.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,44 @@ SpritePro включает легковесную систему частиц,
6767

6868
- `emit(position: Optional[Tuple[float, float] | Vector2] = None, overrides: Optional[ParticleConfig] = None) -> Sequence[Particle]`: Выпустить частицы. Если `position` не указан, используется позиция, установленная через `set_position()`
6969
- `set_position(position: Tuple[float, float] | Vector2, anchor: str | Anchor = Anchor.CENTER)`: Установить позицию эмиттера для последующих вызовов `emit()` без аргументов
70+
- `set_parent(parent, keep_world_position=True, follow_parent=True)`: Назначить родителя для создаваемых частиц
7071
- `get_position() -> Optional[Tuple[float, float] | Vector2]`: Получить текущую позицию эмиттера
7172
- `update_config(**kwargs)`: Обновить конфигурацию эмиттера с заданными значениями
73+
- `set_config(config: ParticleConfig)`: Полностью заменить конфигурацию эмиттера
74+
- `start_auto_emit()` / `stop_auto_emit()`: Включить/выключить авто-эмиссию
75+
- `update(dt: Optional[float] = None)`: Обновление авто-эмиссии (нужно для auto_emit)
76+
77+
### Авто-эмиссия (loop/interval/step)
78+
79+
`ParticleEmitter` умеет автоматически вызывать `emit()` по времени и/или по дистанции.
80+
81+
Параметры конструктора:
82+
- `auto_emit` (bool): включить авто-эмиссию
83+
- `emit_interval` (float | tuple): интервал или диапазон (от, до)
84+
- `emit_step` (float): шаг по расстоянию (0 = отключено)
85+
- `use_dt` (bool): использовать `dt` из update (True) или глобальное время (False)
86+
- `auto_register` (bool): авто-регистрация в `spritePro.update()`
87+
88+
Пример: случайный интервал
89+
```python
90+
emitter = s.ParticleEmitter(
91+
s.template_trail(),
92+
auto_emit=True,
93+
emit_interval=(0.05, 0.15),
94+
auto_register=True,
95+
)
96+
```
97+
98+
Пример: эмиссия по шагам расстояния
99+
```python
100+
emitter = s.ParticleEmitter(
101+
s.template_sparks(),
102+
auto_emit=True,
103+
emit_step=20,
104+
auto_register=True,
105+
)
106+
emitter.set_position(player.rect.center) # обновлять позицию каждый кадр
107+
```
72108

73109
## Particle
74110

0 commit comments

Comments
 (0)