Все значимые изменения в проекте SpritePro будут документированы в этом файле.
Формат основан на Keep a Changelog, и этот проект придерживается Semantic Versioning.
- 📷 README — баннер проекта
assets/spritepro-banner.pngв шапке документации.
- 🔧 Версия библиотеки — релиз обновлён до
3.9.3;spritePro.__version__синхронизирован сpyproject.toml.
- 🐛 Физика: утечка тел при перезапуске сцены —
Sprite.kill()теперь удаляет все привязанныеPhysicsBodyизPhysicsWorldиpymunk.Space. Раньше при перезапуске сцены спрайты удалялись, но их физические тела оставались в мире, вызывая призрачные коллизии и ошибки обращения к мёртвым спрайтам.
- 🔧 Версия библиотеки — релиз обновлён до
3.9.2.
- 🐛 BUG-1: NetServer relay — сервер пересылал сырой TCP-chunk вместо разобранного сообщения. Теперь ретрансляция строит корректный
line.encode("utf-8") + b"\n". - 🐛 BUG-2: ParticleConfig —
angular_velocity_rangeиscale_velocity_rangeимели default(None,)вместоNone, что вызывалоTypeErrorпри распаковке. - 🐛 BUG-5: EventSignal.send() — ошибки в обработчиках подписчиков теперь логируются через
traceback.print_exc()вместо молчаливогоpass. - 🐛 BUG-6: save_load_demo — вызовы
s.debug_log_info()без аргумента заменены наs.debug_log_info("").
- 🔧 ARCH-1: Удалён
sys.path.append()из 8 модулей:button.py,toggle_button.py,text.py,animation.py,mouse_interactor.py,pages.py,text_fps.py,bar.py. Все импорты переведены на относительные. - 🔧 ARCH-2: Python ≥ 3.10 —
requires-pythonобновлён с>=3.7до>=3.10; удалены классификаторы для Python 3.7–3.9;ruff target-versionобновлён доpy310. - 🔧 ARCH-4: Удалён неиспользуемый
import randomизbutton.py. - 🔧 ARCH-8: logging.basicConfig — удалён из
save_load.py,networking.py,utils/logger.py. Библиотечный код не должен конфигурировать logging.
- ⚡ OPT-3+OPT-4: Сетевой буфер —
recv(1024)→recv(4096), строковая конкатенация →bytearray.extend()(O(1) вместо O(n²)) дляNetServerиNetClient.
- 🔒 ARCH-7: Добавлено предупреждение в docstring
_load_pickle()о риске произвольного выполнения кода черезpickle.load().
- 🎭 ClipMask: проверка alpha —
_blit_oneпроверяетsprite._alphaперед blitting; спрайты сalpha=0(контейнеры Layout) полностью пропускаются, не оставляя чёрных прямоугольников. - 🎭 ClipMask: _update_image для скрытых спрайтов — при
hide_content=Trueвызов_update_image()перед blit гарантирует, что dirty-флаги (alpha, color, transform) применяются к surface, даже если sprite.active=False и обычныйupdate()не вызывается. - 🎭 ClipMask: BFS-сбор спрайтов —
_collect_spritesиспользует BFS для рекурсивного обхода иерархииSprite.children, гарантируя правильный порядок отрисовки (от родителя к потомкам) и исключая дубликаты черезseen-множество. - 🔄 ClipMask: синхронизация позиций — перед отрисовкой вызываются
_apply_parent_transform()и_update_children_world_positions()для каждого спрайта, обеспечивая корректные позиции без лишних draw-вызовов.
- 📐 Sprite.set_position() — добавлен вызов
_update_children_world_positions(). Теперь при изменении позиции родителя дочерние спрайты корректно синхронизируют свои мировые координаты (аналогичноset_world_position()). Критично дляScrollView.apply_scroll(). - 🎭 ClipMask.draw() — bg_color теперь опционален. Для ChatUI фон предоставляется отдельным
panel_bgспрайтом со скруглёнными углами, а ClipMask только обрезает сообщения.
- 🐛 Layout._apply_debug_style: порядок
set_alpha(0)/set_rect_shape()был инвертирован —set_rect_shapeсоздавал новую surface и затирал ранее установленную alpha. Теперь alpha применяется после создания surface. - 🐛 ChatUI: регистрация пузырей в маске — восстановлен
_clip_mask.add(bubble)для каждого нового сообщения и_clip_mask.remove(bubble)при перестройке. Без этого пузыри рисовались основным циклом без клиппинга. - 🐛 ClipMask: сортировка с None —
sorting_order=Noneбольше не вызываетTypeErrorпри сортировке; используетсяgetattr(s, "sorting_order", 0) or 0.
- 🌐 Мультиплеер: ChatScene — готовая сцена мультиплеерного чата с ClipMask, ScrollView, Layout, полем ввода и кнопкой отправки.
- 📜 ScrollView — компонент прокрутки контента с поддержкой колёсика мыши и перетаскивания.
- 🎭 ClipMask — маска обрезки (
hide_content=True/False) для ограничения видимости спрайтов прямоугольной областью.
- 🌐 MultiplayerContext: автозаполнение
ctx.players/ctx.get_player_ids()изroster, включая имя игрока из лобби. - 🏷️ Встроенное лобби: имя из поля «Имя» отправляется в
joinи отображается в списке игроков.
- ✨ Мобильный ввод: экранная клавиатура для TextInput — в Kivy‑режиме SpritePro автоматически запрашивает системную софт‑клавиатуру, когда любое поле
s.TextInputстановится активным. Событияon_key_downиon_textinputиз Kivy транслируются вpygame.KEYDOWNиpygame.TEXTINPUT, поэтомуTextInputобрабатывает ввод на Android так же, как на desktop.
- 🔧 Kivy mobile host —
_KivySpriteProWidgetотслеживает активныеs.TextInputи открывает/закрывает экранную клавиатуру черезWindow.request_keyboard(...). Закрытие клавиатуры происходит автоматически при деактивации всех полей ввода (по Enter или при тапе вне поля). - 🔧 Версия библиотеки — релиз обновлён до
3.3.0.
- Project template paths —
spritePro.cli --createтеперь создаётconfig.pyс готовыми путямиPROJECT_ROOT,ASSETS_DIR,AUDIO_DIR,IMAGES_DIR,SCENES_DIRиMAIN_LEVEL_PATH, чтобы в новых проектах не нужно было каждый раз вручную собиратьPath(__file__).resolve().... - Project template events file — в шаблон добавлен
game_events.pyс базовым событиемgame_started, подпиской черезs.events.connect(...), отправкой черезs.events.get_event(...).send(...)и логом черезs.debug_log_info(...).
- Project template structure — шаблон
--createпо умолчанию создаётmain.py,config.py,game_events.py,scenes/main_scene.py,scenes/second_scene.pyиscenes/main_level.json. Вторая сцена остаётся почти пустой заготовкой для меню, паузы, магазина или другого уровня. - Multiplayer entrypoint — рекомендации, demoGames и
multiplayer_courseобновлены под единый app-level запуск черезs.run(..., multiplayer=True), аs.networking.run(...)оставлен как low-level runner. - Версия библиотеки — релиз обновлён до
3.2.0.
- Editor runtime image sizing — runtime-сцены, созданные в редакторе, снова корректно подхватывают размер image-объектов в embedded/Kivy-сценариях вместо fallback-белого прямоугольника.
- Редактор: Text object — в Sprite Editor появился тип объекта
Text: его можно создать черезGameObject -> New Text, редактировать текст,Font Sizeи цвет в Inspector, аspawn_scene(...)автоматически поднимает такие объекты какTextSprite. - Редактор: dropdown menu bar — верхняя панель собрана в расширяемые меню
File,GameObject,Tools,Viewс видимыми hotkey-подсказками рядом с действиями.
- Редактор: модульность — часть крупной логики вынесена из
spritePro/editor/editor.pyвspritePro/editor/file_actions.pyиspritePro/editor/object_actions.py, чтобы редактор было проще расширять дальше. - Редактор: hierarchy UX — контекстное меню в иерархии локализовано (
Дублировать/Удалить), показывает hotkeys и визуально выделяет удаление. - Версия библиотеки — релиз обновлён до
3.2.1.
- Редактор: статусные сообщения —
Saved,Loaded,Invalid inputи ошибки больше не теряются в нижней панели: теперь они показываются заметной toast-плашкой поверх viewport.
- Reference resolution — в
s.run(...),s.get_screen(...),s.attach_surface(...),s.run_kivy(...),s.run_kivy_hybrid(...)иs.create_kivy_widget(...)добавлен параметрreference_size, который позволяет держать игровую логику,s.WH,s.WH_C, screen-space UI и camera math в виртуальном разрешении, независимо от реального размера окна или Kivy-host.
- Масштабирование кадра — SpritePro теперь умеет рендерить сцену во внутреннюю виртуальную поверхность и затем масштабировать итоговый кадр в фактическое окно с сохранением пропорций.
- Input remap —
input.mouse_pos,mouse_relиevent.pos/event.relавтоматически пересчитываются из реального окна в координатыreference_size, чтобы клики, drag и hover оставались корректными. - Документация по game loop — в README и
docs/game_loop.mdдобавлены примеры использованияreference_sizeдля desktop-preview и mobile-layout сценариев. - Версия библиотеки — релиз обновлён до
3.1.0.
- Android orientation modes — в
spritePro.cli --androidдобавлены удобные режимы ориентацииlandscape(по умолчанию),portraitиautoдля генерацииbuildozer.spec.
- Mobile preview docs — README и mobile/building docs уточнены под реальный workflow тестирования на разных размерах окна без огромных fullscreen-preview на desktop.
- Документация по ориентации — в docs добавлены примеры, как переключать
portrait,landscapeиautoдля Android APK. - Версия библиотеки — релиз обновлён до
3.0.3.
- Android/Kivy fullscreen — mobile host надёжнее растягивает игру на весь экран Android-устройства вместо маленькой игровой области.
- Физика после лаг-кадров — шаг физики ограничен безопасным
dt, чтобы уменьшить скачки скорости и провалы объектов при нестабильном FPS на mobile. - Restart сцены с физикой — runtime-сцены теперь корректно очищают заспавненные физические тела и спрайты при выходе/перезапуске сцены.
- Android/Kivy runtime — инициализация
pygameв mobile-host сделана безопаснее дляpython-for-android: на Android ранний importSpriteProбольше не поднимает агрессивныйpygame.init()/pygame.mixer.init()до запускаKivyhost. - Совместимость с Android stack — убраны места, где код опирался на
pygame.math.Vector2.copy(), потому что в реально используемом Android-стеке сpygame 2.1.0этот метод может отсутствовать. Это исправляет падения при создании текста, tween-значений, camera offset и drag/update-сценариев. - Аннотации импорта — в
spritePro.__init__включены postponed annotations, чтобы импорт библиотеки не падал на Python 3.10 внутри Android bootstrap. - Документация по APK build — README и Android-docs обновлены под реально проверенный flow:
WSL/Linux home, стекpython3==3.10.12,hostpython3==3.10.12,kivy==2.3.0,pyjnius==1.5.0,pygame,pymunk,spritepro, проверка запуска черезadb logcat, а для непубликованных локальных фиксов — явное включение свежегоspriteProв проект сборки. - Версия библиотеки — релиз обновлён до
3.0.2.
- Редактор: Save As — в тулбаре появилась отдельная кнопка
Save As, а также горячая клавишаCtrl+Shift+Sдля сохранения сцены в новый JSON-файл.
- Редактор: пути к изображениям — при сохранении сцены
sprite_pathтеперь автоматически нормализуется относительно JSON-файла, чтобы сцены оставались переносимыми между машинами и каталогами. - Runtime round-trip —
RuntimeScene.save(...)теперь тоже пересчитывает пути к изображениям относительно нового JSON, а runtime использует ту же общую логику поиска ассетов, что и редактор. - Версия библиотеки — релиз обновлён до
3.0.1.
- Mobile runtime через Kivy — одну и ту же игру теперь можно запускать через
s.run(..., platform="pygame")иs.run(..., platform="kivy"). Добавлены low-level API для embedded-рендера и mobile host, touch-события прокидываются в игровой ввод. - Новый mobile demo — добавлен
spritePro/demoGames/mobile_orb_collector_demo.pyкак пример игры с экранными кнопками и запуском в Kivy. - Документация по мобильному запуску и сборке — добавлены и обновлены материалы по mobile flow, Kivy runtime, web/mobile build и запуску demo.
- Основной игровой запуск — рекомендованный путь теперь через
s.run(...),SceneиSceneManager, вместо ручногоwhile True: s.update(...)в каждом примере. - Демо-игры — демо переведены на новый Scene-based запуск; часть примеров теперь умеет запускаться и в
Kivy. - CLI
--create— шаблон нового проекта теперь создаёт современный scene-based старт:main.pyнаs.run(...), основную сцену сmain_level.jsonи вторую сцену-заготовку для расширения проекта. - README и docs — главный README обновлён под SpritePro 3.x: desktop/web/mobile позиционирование, ссылки на mobile/build guide, актуализированные примеры запуска.
- Версия библиотеки — релиз обновлён до
3.0.0.
- Ввод в mobile host — обработка
mouse_pos, нажатий, отпусканий и перемещения мыши/тача теперь работает корректнее в embedded/Kivy-режиме. - UI взаимодействие —
MouseInteractorиспользует обобщённый input state, поэтому hover/click работают стабильнее в desktop и mobile host.
- Редактор: типизированные поля ввода — каждое текстовое поле в Inspector и Statusbar имеет тип text, int или float. Для int допускаются только цифры и минус в начале; для float — одна десятичная точка. Некорректные символы не вводятся и отфильтровываются при вставке. Парсинг и ограничения (min/max) выполняются при применении значения.
- Редактор: Ctrl+V / Ctrl+C в полях ввода — при фокусе в текстовом поле Ctrl+V вставляет текст из буфера обмена (с фильтрацией по типу поля), Ctrl+C копирует содержимое поля в буфер.
- Версия 2.2.3. В docs/sprite_editor.md обновлены разделы про поля ввода, горячие клавиши и ограничения.
- Редактор: применение значений из полей — значения Mass, Friction, Bounce (и остальные свойства) из Inspector теперь корректно записываются в объект при нажатии Enter или клике вне поля (раньше для physics_* применялись только кнопки +/-).
- Редактор: применение по Enter и при потере фокуса — одно и то же поведение для всех текстовых полей: Enter или клик в другое место применяет введённое значение.
- Документация: физика из сцены редактора — в docs/physics.md добавлен раздел «Получение и настройка физики из сцены редактора»:
s.get_physics(sprite),set_bounce(0), задание скорости, удаление тела и создание своего, границы мира. Пример кода и ссылка на demoGames. - demoGames/ в корне репозитория — пример сцены из редактора (level.json) с получением и настройкой физики в коде (платформер); README с инструкцией запуска и описанием.
- Версия 2.2.2. В docs/sprite_editor.md и docs/OVERVIEW.md добавлены упоминания
get_physicsи донастройки физики из кода. В разделе «Демо и примеры» docs/physics.md добавлен пункт про demoGames.
- Физика на pymunk — реализация модуля физики переведена на библиотеку pymunk (2D-движок Chipmunk). Формы коллайдеров: прямоугольник по
sprite.rect, круг, линия (segment); задаются через PhysicsShape (AUTO, BOX, CIRCLE, LINE) или строки. - PhysicsConfig: опциональные поля
collision_categoryиcollision_maskдля фильтра коллизий; по умолчанию тело сталкивается со всеми. - Редактор сцен: для объектов с типом физики (Static/Kinematic/Dynamic) в Inspector доступны Mass, Friction, Bounce и при необходимости Category/Mask; значения сохраняются в JSON и подставляются в PhysicsConfig при загрузке сцены.
- Версия библиотеки 2.2.0. Обратная совместимость API сохранена:
add_physics,add_static_physics,add_kinematic_physics,PhysicsConfig,PhysicsBody(velocity, position, grounded, apply_impulse, set_velocity, set_bounds, add_constraint и т.д.) работают как раньше. - Синхронизация спрайт↔тело: при любом изменении позиции спрайта привязанное тело сразу телепортируется; для static позиция берётся из спрайта каждый кадр, для dynamic/kinematic спрайт следует за телом после шага физики. Поворот с физикой не синхронизируется — в спрайт записывается только позиция (
rect.center), угол из тела в спрайт не переносится (избегается рост rect при повороте). - Документация: docs/physics.md переписана под pymunk (PhysicsShape, формы, отсутствие синхронизации поворота); docs/physics_issues.md, docs/sprite_editor.md и docs/OVERVIEW.md обновлены.
- Добавлена зависимость
pymunk>=6.0.0(поддерживаются pymunk 6 и 7).
- Sprite Editor — визуальный редактор спрайтов в стиле Unity
- Viewport — центральная область редактирования с сеткой
- Инструменты: Select (V), Move (G), Rotate (R), Scale (T)
- UI панели: Hierarchy (слева), Inspector (справа), Toolbar (сверху), Statusbar (снизу)
- Drag & Drop — перетаскивание изображений из проводника
- Undo/Redo — Ctrl+Z / Ctrl+Y
- Копирование/Вставка — Ctrl+C / Ctrl+V
- Камера: zoom колесом мыши, pan средней кнопкой
- Сетка: настраиваемый размер, привязка к сетке
- Сохранение/Загрузка: JSON формат
- CLI команда — запуск редактора:
python -m spritePro.cli --editorили-e - Модуль scene — классы Scene, SceneObject, Transform для работы со сценами
- Документация: docs/sprite_editor.md
- Версия библиотеки 2.0.0 (мажорный релиз — новый редактор)
- Обновлена документация: добавлен раздел о редакторе в README
- Улучшена структура проекта: редактор вынесен в tools/sprite_editor
- Добавлена поддержка Python 3.13
- Редактор: числовые поля в Inspector — при вводе цифр символы больше не дублируются (11, 00, 22). Ввод обрабатывается только через TEXTINPUT; в KEYDOWN оставлены Enter/Escape/Backspace и fallback для keypad.
- Лобби мультиплеера (готовый экран) — сцена
MultiplayerLobbyScene(s.Scene)с полной очисткой спрайтов вon_exit(). При нажатии «В игру» хост рассылает событиеstart_game, игра запускается у обоих (хост и клиент). Экспорт:EVENT_START_GAME,MultiplayerLobbyScene,run_multiplayer_lobbyизspritePro.readyScenes. - Кнопка «Готов» для клиента в лобби — переключатель с визуальной подсветкой (активное состояние «Готов ✓»), отправка события
readyс полемvalue(True/False) для опциональной логики на хосте. - TextSprite: поддержка переносов строк — символ
\nв тексте отображается как многострочный блок (рендер по строкам, отступ между строками). Удобно для списков игроков, подсказок, логов.
- Лобби — все UI-элементы (включая
text_spriteкнопок и полей ввода) снимаются с регистрации при переходе в игру; список игроков (roster) отображается с переносами строк.
- Подробная инструкция по лобби в docs/networking.md (запуск, сценарий для игрока и разработчика).
- Обновлены docs/text.md (многострочный текст), docs/readySprites.md (лобби), DOCUMENTATION_INDEX.md.
- Лобби мультиплеера — убрана кнопка «Готов». В лобби у хоста: кнопки «Назад» и «В игру»; у клиента: кнопка «Назад». «Назад» отключает соединение (сервер/клиент) и возвращает к экрану настройки (имя, хост/клиент, порт, IP).
- Лобби (режим хоста): при входе в игру из лобби выставляется файл debug-лога по роли (
debug_host.log/debug_client.logвSPRITEPRO_LOG_DIR), лог хоста пишется корректно.
- Физика: подсказки и докстринги для
s.physics— у прокси глобального мира явно объявлены методыadd,add_static,add_kinematic,remove,set_gravity,set_bounds,add_constraint,remove_constraintс типами и докстрингами для IDE. - Физика: авто-добавление тел в мир — у
add_physics,add_static_physics,add_kinematic_physicsпараметрauto_add=Trueпо умолчанию: тело сразу попадает в глобальный мир, вызыватьs.physics.add(body)вручную не нужно. Для ручного контроля можно передатьauto_add=False. - Редактор сцен: физика из сцены — при загрузке сцены через
spawn_scene()объекты с выставленным в редакторе типом физики (Static / Kinematic / Dynamic) автоматически получают тело и добавляются в глобальный мирs.physics; отдельный мир для сцены больше не создаётся. - Builder: типизированный возврат
build()—s.sprite(path).build()возвращаетSprite(явная типизация в коде и публичном API для корректных подсказок в IDE).
- Физика — демо
physics_demo,hoop_bounce_demo, ping_pong переведены наauto_add=Trueи импортimport spritePro as s; ручные вызовыs.physics.add(...)убраны. Остальные демо (visibility_culling, hot_reload, frame_tween, builder, particle_pool) и их копии в web_build переведены наs; в web_build синхронизированы physics_demo, hoop_bounce_demo, object_pool_demo и ping_pong (убраны лишниеphysics.add). - Документация — docs/physics.md: добавление тел через
s.add_physics,s.PhysicsConfigи т.д., запуск демо из корня репозитория. docs/sprite.md: раздел «Столкновения по маске» (ensure_mask, collide_mask, collides_with). docs/builder.md: ссылка на проверку столкновений по маске. docs/OVERVIEW.md, DOCUMENTATION_INDEX.md: физика черезs., Sprite mask collision.
- Sprite: столкновения по маске — методы
ensure_mask(),collide_mask(other),collides_with(other, use_mask=True)для пиксельно-точных столкновений при включённомupdate_mask(в Builder:.mask(True)). Документация: docs/sprite.md. - Физика: глобальный мир — один мир создаётся с игрой и доступен через
s.physicsилиs.get_physics_world(). Гравитация:s.physics.set_gravity(980). Ограничения с методомupdate(dt):s.physics.add_constraint(constraint)— мир сам вызывает их после шага физики. СоздаватьPhysicsWorldи вызыватьregister_update_object(world)не нужно. - Ping Pong (демо) — мяч на физическом движке (динамическое тело), ракетки и стены — статика. При ударе о ракетку задаётся направление по месту касания (offset по вертикали), константа
PADDLE_AIM_STRENGTH. Подача с минимальной вертикальной составляющей (мяч не летит строго по прямой). - EventSignal и мультиплеер — у объекта из
s.events.get_event(name)методsend(route="all", net=ctx, **payload)рассылает событие локально и в сеть (какs.events.send(...)). Удобно хранить ссылку на событие:start_game = s.events.get_event("start_game"); start_game.send(route="all", net=ctx). - CLI
--create(архитектура шаблона): новый проект теперь включаетscenes/level.json(уровень редактора) и сцену, которая загружает его черезspawn_scene(...). Игрок берётся по имениplayerиз JSON (rt.exact("player").Sprite(speed=5)), при отсутствии/ошибке JSON включается безопасный fallback без падения. - Экспорт сцены из кода в JSON —
Scene.from_runtime(scene_instance)иScene.export_from_runtime(scene_or_class, filepath)вspritePro.editor.scene. Имена объектов = атрибуты сцены, позиция = центр спрайта; round-trip: код → JSON → правки в редакторе → загрузка в игре. Демо:scenes_demo editor.py. - Runtime сцен из редактора:
placement()возвращает pos как центр (rect.centerx, centery);to_button,to_text_sprite,to_toggleиспользуют его по умолчанию.exact(name)— поиск по точному имени. Демо SceneA загружает сцену изscene_a.jsonчерезspawn_scene, вешает логику черезrt.exact("mover").Sprite(speed=1),to_button,to_toggleи т.д. - Типы спрайтов в редакторе — примитивы Rectangle, Circle, Ellipse (по аналогии с Unity: GameObject → 2D → Square). Модуль
spritePro.editor.sprite_types. В тулбаре кнопки Rect, Circle, Ellipse; в Inspector выпадающий список Sprite Type (Image / Rectangle / Circle / Ellipse) и для примитивов — Color R/G/B и размер (Size X/Y). В сцене:sprite_shape,sprite_color, для примитивов размер вcustom_data(width, height). Runtime создаёт соответствующие спрайты при загрузке сцены. - Общий модуль отрисовки сетки —
spritePro.grid_renderer: единая функцияdraw_world_grid()для игры и редактора. Сетка (шаг 10/50/500) и подписи координат с плотностью, зависящей от зума (чем меньше зум — реже подписи, без «мельтешения» текста). - Редактор: подписи координат на сетке — переключатель «Labels ON/OFF» в статусбаре и в Settings → Scene (Grid Labels). Подписи используют ту же зум-адаптивную логику, что и в игре.
- Физика — демо
physics_demo,hoop_bounce_demoпереведены на глобальный мирs.physics(без своегоPhysicsWorldи безregister_update_object). Документация docs/physics.md: раздел «Глобальный мир физики»,set_gravity,add_constraint/remove_constraint, примеры без создания мира. - Hoop Bounce (демо) — обруч рисуется одним кольцом (заливка внешнего круга + вырез внутреннего), без двойного контура от
pygame.draw.circle(..., width=...). - Редактор: позиция объекта в JSON и в viewport — центр спрайта (transform.x, transform.y). Экспорт из runtime записывает rect.center.
- Sprite (примитивы): при
set_rect_shape/set_circle_shape/set_ellipse_shapeсохраняются цвет и флаг_shape_fill_color, чтобы цвет не терялся при перезапуске сцены и не применялся двойной тинт. - Button и TextSprite — по умолчанию
screen_space=True: позиция и размер не зависят от камеры и зума. Для кнопки/текста в мировых координатах (например над объектом) можно вызвать.set_screen_space(False). - Debug-сетка — подписи координат рисуются через
grid_rendererс адаптивным шагом (min_label_px, «удобные» шаги 1/2/5/10/25/50). Редактор рисует сетку и подписи тем же модулем.
- CLI
--createшаблон сцены: исправлена загрузкаplayerизlevel.json— больше нетNone.Sprite(...), fallback-игрок не создаётся поверх успешно загруженного уровня.
- Продвинутые UI компоненты
- Tween.completion_value — при SetYoyo(True) запоминается исходная стартовая позиция; при Kill(complete=True) применяется она (логический конец анимации), а не конец текущего полуцикла. Можно вызывать DoKill(True) и сразу новый DoMoveBy без ручного set_position.
- Документация: docs/tween.md, докстринг DoKill — уточнено поведение Kill(complete=True) при yoyo.
- SetLoops(count) — исправлена логика циклов: раньше при любом
count != 0твин шёл бесконечно. ТеперьSetLoops(1)= один проход и завершение,SetLoops(2)= два прохода,SetLoops(-1)= бесконечно. В Tween добавленыloop_countи счётчик_loops_done.
- Документация: docs/tween.md — уточнено описание SetLoops (0/1/2+/−1).
- Sprite.DoKill(complete=False) — останавливает все твины этого спрайта (DoMove, DoScale и т.д.). Без хранения хэндлов:
sprite.DoKill(complete=False)илиDoKill(complete=True)(применить конец и on_complete). Возвращаетself. - TweenHandle.Restart(apply_end=False) — сброс твина в начало и повторный запуск. Работает и после
Kill()(твин снова регистрируется и возвращается в список спрайта для DoKill). - Do*-методы регистрируют твины у спрайта; при завершении или при
handle.Kill()твин удаляется из списка.handle.Kill()также убирает твин из списка спрайта.
- DoMove и остальные Do* возвращают твин (TweenHandle), не спрайт. Хэндл можно сохранить и удалить/перезапустить только его:
h = sprite.DoMove(...); h.Kill()илиh.Restart(). - Документация: docs/tween.md — уточнено, что Do* возвращают TweenHandle; добавлены примеры сохранения хэндла, Kill одного твина, Restart; метод DoKill и Restart в таблицах.
- Готовые сцены (readyScenes) — модуль
spritePro.readyScenesдля подключения готовых сцен в играх. ChatScene — мультиплеерный чат с историей, полем имени, сообщениями (время ЧЧ:ММ:СС), скроллом (колёсико и перетаскивание мышью по области), маской обрезки по viewport. ChatStyle — класс стиля (цвета, шрифты, отступы); можно переопределить перед использованием. Подключение:from spritePro.readyScenes import ChatScene, ChatStyle; после инициализации мультиплеера —s.scene.add_scene("chat", ChatScene)иs.scene.set_scene_by_name("chat", recreate=True). - ScrollView: параметр use_mask=True (по умолчанию) — контент за границами viewport не отображается (клиппинг); опциональный аргумент mouse_drag_delta_y в update_from_input() для скролла перетаскиванием мыши по области.
- TextSprite: свойство input_active — при
Trueи пустом тексте отображается курсор «|»; при первом вводе символ курсора исчезает. Для сцен с полем ввода выставляйтеinput_activeу активного поля перед вызовомinput().
- Чат перенесён в библиотеку: сцена и стиль в
spritePro.readyScenes.chat; пример запуска —multiplayer_course/Chat/example_chat.py(импорт ChatScene, ChatStyle из readyScenes). - Документация: docs/layout.md — раздел «Скролл (ScrollView)» дополнен: use_mask, скролл мышью; docs/README.md — добавлен раздел «Готовые сцены (readyScenes)»; README.md — упоминание готовых сцен в «Что внутри».
- Версия библиотеки 1.4.6 (патч).
- Layout: вставка и перестановка детей —
add(child, index=None): при указании index вставка в произвольное место (0 — в начало).add_at_start(child)— в начало.add_children(*children, index=None)— при index вставка с указанной позиции.move(child, index)— перенос уже добавленного ребёнка на новую позицию в списке (меняет порядок расстановки). - Документация: docs/layout.md — раздел «Добавление в начало/по индексу и move».
- Версия библиотеки 1.4.5 (патч).
- Удобные функции лейаута (size, pos, scene) — во все функции
layout_flex_row,layout_flex_column,layout_horizontal,layout_vertical,layout_grid,layout_circle,layout_lineдобавлены опциональные аргументы size, pos, scene. Приcontainer=Noneих можно передать сразу в вызов, без цепочки.set_position().set_size():s.layout_flex_column(None, [text, button], gap=20, pos=s.WH_C, size=(400, 300)). - Ручной режим лейаута (auto_apply) — у Layout и у всех удобных функций добавлен параметр auto_apply=True. При auto_apply=False методы
add,add_children,remove,remove_children,set_sizeне вызываютapply(); расстановка обновляется только при явном вызовеrefresh()илиapply(). Свойствоlayout.auto_applyможно менять в runtime. - Документация: docs/layout.md — разделы «Удобные функции: size, pos, scene», «Ручной режим (auto_apply=False)», пример в одну строку.
- Версия библиотеки 1.4.4 (патч).
- Sprite.set_scene(scene) — при передаче None спрайт снимается с регистрации (перестаёт обновляться и рисоваться). При передаче сцены спрайт при необходимости снова регистрируется. Раньше присваивался только атрибут
scene, спрайт оставался в группе отрисовки. - Sprite.set_scene(scene, unregister_when_none=True) — добавлен параметр unregister_when_none: при
scene=Noneиunregister_when_none=Falseтолько обнуляется привязка к сцене, регистрация не снимается (спрайт остаётся в игре и рисуется).
- Sprite.set_size(size) — установка ширины и высоты в пикселях (не scale). Возвращает
self. Аргумент:(width, height)или Vector2. - Layout.set_size(size) — переопределение: меняет размер контейнера, при
container=Noneсохраняет стиль и вызываетapply()для перерасчёта детей. Возвращаетself. - Примитивы с опциональными size и color: у
set_rect_shape,set_circle_shape,set_ellipse_shape,set_polygon_shape,set_polylineпараметрыsizeи/илиcolorможно не указывать (None): берётся текущий размер и текущий цвет спрайта (для цвета при отсутствии tint — белый). Вспомогательный метод_shape_color(color). - Документация: docs/sprite.md — добавлены
set_sizeв список цепочек, раздел «Размер и примитивы»; docs/layout.md — раздел «Изменение размера (set_size)». - Версия библиотеки 1.4.3 (патч).
- Цепочки вызовов (продолжение) — возврат
selfдобавлен для методов движения, коллизий и UI:- Sprite:
limit_movement,reset_sprite,move,move_towards,move_up,move_down,move_left,move_right,stop,rotate_by,fade_by,scale_by,handle_keyboard_input,remove_collision_target,remove_collision_targets,clear_collision_targets. - Button:
on_click,on_hover. - ToggleButton:
toggle.
- Sprite:
- Документация: docs/sprite.md — раздел «Цепочки вызовов» дополнен списком методов движения и примером с
handle_keyboard_input().limit_movement(). - Версия библиотеки 1.4.2 (патч).
- Цепочки вызовов (fluent setters) — методы установки возвращают
selfдля цепочек:- Sprite:
set_position,set_scale,set_angle,rotate_to,set_alpha,set_color,set_sorting_order,look_at,set_screen_space,set_parent,set_world_position,set_image,set_rect_shape,set_circle_shape,set_ellipse_shape,set_polygon_shape,set_polyline,set_native_size,set_flip,set_active,set_scene,set_velocity,set_state,set_collision_targets,add_collision_target,add_collision_targets. - TextSprite:
set_text,set_color,set_font. - Button:
set_base_color,set_all_colors,set_all_scales,set_scale,set_sorting_order. - ToggleButton:
set_state,set_colors,set_texts. - Bar:
set_fill_amount,set_fill_direction,set_animate_duration,set_fill_type,set_image,set_fill_image,set_fill_color,set_background_image,set_background_size,set_fill_size,set_both_sizes. - Layout:
add,add_children,remove,remove_children,apply,refresh. - Обратная совместимость сохранена.
- Sprite:
- Демо: в
fluent_tween_demo,layout_demo,primitives_demo,tween_presets_demo,bar_demoиспользованы цепочки вызовов. - Документация: docs/sprite.md — раздел «Цепочки вызовов» расширен; docs/layout.md — добавлено про цепочки
add/apply/refresh. - Версия библиотеки 1.4.1 (патч).
- Fluent Tween API (Do-твины): удобный цепочечный API в стиле DOTween.
- Методы на Sprite:
DoMove,DoMoveBy,DoScale,DoScaleBy,DoRotate,DoRotateBy,DoColor,DoAlpha,DoFadeIn,DoFadeOut,DoSize,DoPunchScale,DoShakePosition,DoShakeRotation,DoBezier— по умолчаниюEase.OutQuad, автоудаление по завершении. - TweenHandle: цепочка
SetEase,SetDelay,OnComplete,SetLoops,SetYoyo,Kill(complete=False|True). - Ease: enum с именами In/Out/InOut по кривым (OutQuad, InCubic, InOutSine и др.), альтернатива
EasingType. - Зацикливание: режим reset по умолчанию,
SetYoyo(True)для движения туда-обратно; при завершении (если не loop) твин сам снимается с обновления.
- Методы на Sprite:
- Tween: параметр
auto_remove_on_complete;stop(apply_end, call_on_complete)дляKill(complete=True);set_easing(); в пресетах — параметрauto_remove_on_complete. - Демо:
spritePro/demoGames/fluent_tween_demo.py— примеры Do*, цепочки, циклы 8/9/0, Kill. - Документация: раздел «Fluent API (Do-твины)» в docs/tween.md, таблицы методов Do* и TweenHandle, обновлены README и docs/README.md.
- Крестики-нолики (мультиплеер): анимации на Fluent Tween — появление символа в ячейке (DoPunchScale), пульс по выигрышной линии, отдача кнопки «Новая игра».
- Версия библиотеки 1.4.0 (минор).
- Модуль layout (
spritePro.layout): автолейаут для дочерних спрайтов.- Layout наследует Sprite: лейаут можно перемещать; при
container=Noneлейаут сам является контейнером (параметры size, pos, scene), дети при add/remove привязываются через set_parent. - LayoutDirection: FLEX_ROW, FLEX_COLUMN, HORIZONTAL, VERTICAL, GRID, CIRCLE, LINE.
- LayoutAlignMain / LayoutAlignCross: выравнивание (START, CENTER, END, SPACE_BETWEEN, SPACE_AROUND, SPACE_EVENLY).
- GridFlow: ROW, COLUMN для сетки.
- Контейнер: Sprite, (x, y, w, h) или None (лейаут-спрайт как контейнер). Список расставляемых детей — arranged_children.
- Удобные функции: layout_flex_row, layout_flex_column, layout_horizontal, layout_vertical, layout_grid, layout_circle, layout_line.
- Авто-обновление при add/remove детей; ручной refresh/apply при смене параметров или типа.
- Для CIRCLE: rotate_children и offset_angle. gap и padding как число или кортеж.
- Layout наследует Sprite: лейаут можно перемещать; при
- docs/layout.md: описание API, Layout как Sprite, container=None, arranged_children, use_local, пример «лейаут как перемещаемый блок».
- spritePro/demoGames/layout_demo.py: демо всех типов лейаута (FLEX_ROW, FLEX_COLUMN, GRID, HORIZONTAL, VERTICAL, CIRCLE, LINE).
- Версия библиотеки 1.3.4 (минор).
- docs/networking.md: раздел «Лучшие практики» — примитивы JSON (что можно отправлять), позиция списком
list(pos)и приём черезdata.get("pos", ...), значения по умолчанию, троттлинг. - docs/networking.md: таблица полей контекста, «Кто такой этот процесс», «Отображаемое имя», «Как отличить своего игрока от чужих».
- Позиция по сети: во всех примерах и курсе — отправка
{"pos": list(pos)}, приёмremote_pos[:] = data.get("pos", ...); убраны лишниеfloat()и поляx/y. - Лобби (урок 4): при отправке
joinдобавляем себя вplayersлокально (players.add(name)), чтобы хост и все клиенты видели полный список (реле не отдаёт сообщение отправителю). - Демо и курс: упрощена обработка
sender_id(без лишних try/except и int()), компактное получениеother_id = data.get("sender_id")где уместно. - Версия библиотеки 1.3.3 (патч).
- Сетевые логи: запись в файл
spritepro_logs/debug_net_<tag>.log(каталог рядом со скриптом); тег процесса —host,client_0,client_1и т.д.; в строках лога выводится callsite; вывод в debug overlay черезnet_log_to_overlay(). - Критические ошибки: при FATAL traceback пишется в сетевой лог и в
s.debug_log_error. - Оверлей-логи в мультиплеере: при переменной окружения
SPRITEPRO_NET_LOG_TAGлог-файл оверлея —spritepro_logs/debug_<tag>.log(отдельный на каждый процесс).
- Версия библиотеки 1.3.2 (патч).
- NetClient.connect(): при ошибке подключения — явное сообщение в лог и подсказка (--quick / --server).
- GitHub Actions: отступы в
publish-to-pypi.yml(корректный YAML для steps).
- Версия библиотеки 1.3.1 (патч).
- 📚 EventBus.send: подробный Google-докстринг с вариантами route (local/server/clients/all/net), net, include_local и **payload; примечание про проброс входящих без route.
- 📝 Курс: в примерах (урок 3, урок 10) добавлены комментарии о вариантах отправки и ссылка на докстринг.
- Версия библиотеки 1.3.0 (минор).
- 🌐 MultiplayerContext: глобальный контекст для мультиплеера (role/id, send/poll/send_every)
- 🧭 send_every: лимитер частоты отправки сетевых событий
- 📚 Курс по мультиплееру: 9 уроков с примерами/практикой/решениями
- 🧭 EventBus routing: отправка событий локально и в сеть (local/server/clients/all)
- 🎮 Demo:
events_rps_demo.py(камень/ножницы/бумага) на Events + Multiplayer
- 🧪 Демо мультиплеера: переход на MultiplayerContext и лимитер отправки
- 📝 Документация: обновлен
docs/networking.mdи README курса - 🔁 Networking run(): тикрейт сервера по умолчанию 30 и флаг
--tick_rate - 🎯 MultiplayerContext:
is_host, цвет вынесен из контекста
- 🗺️ Amongus demo: исправлены пути к спрайтам
- 🌐 Sprite.set_world_position(): публичная установка мировой позиции
- 📚 Документация: добавлено описание world position и мультиплеера
- 🌐 Networking: NetServer/NetClient для простого мультиплеера
- 📚 Документация: добавлен
docs/networking.md
- 🖱️ Button: не обрабатывает клики, когда сцена не активна
- 🧷 Screen-space:
set_screen_space()теперь применяется ко всем дочерним спрайтам
- 🧩 Scene-aware компоненты: Button/ToggleButton/TextSprite/Timer/Tween/Animation поддерживают
sceneв конструкторе - ⏱️ Scene updates: Timer/Tween/TweenManager/Animation автоматически приостанавливаются, если сцена не активна
- 🎬 Scene API: удобный доступ через
s.sceneи авто‑создание сцен из фабрик - 📷 Camera shake: встроенный эффект с перезапуском (
s.shake_camera) - 🧭 Sprite.local_position: локальная позиция относительно родителя
- 🧩 Tween API: stop/reset/remove поддерживают apply_end
- 📚 Документация: обновлены разделы по сценам/камере/твинам
- 🎞️ Tween presets: готовые твины для позиции, масштаба, поворота, цвета, прозрачности и размера
- 📚 Документация: обновлён
docs/tween.mdи добавленdocs/tween_presets.md - ✨ Новые твины: punch/ shake/ fade/ flash/ bezier
- 🎯 Sprite.look_at: поворот к цели с оффсетом
- 🎮 Demo: tween_presets_demo.py с подсказками
- ⏱️ TICK: глобальное событие каждого кадра (dt, frame_count, time_since_start)
- 🧮 Счётчики времени: frame_count и time_since_start в GameContext и глобальных
- 🧩 EventBus: общий базовый сигнал для локальных и именованных событий
- 🎮 EventBus demo: таймерный tick вынесен в отдельное событие
- 📚 Документация: обновлены события и параметры контекста
- 📝 Докстринги: обновлены описания ввода, сцен, кэша и событий
- 🧷 GlobalEvents: список глобальных событий без строковых литералов
- 🔔 LocalEvent: локальные события в переменных
- 🎮 EventBus demo: показ
LocalEventиs.globalEvents
- 🧭 Debug HUD: FPS и координаты камеры
- 🧾 Логи: уровни (info/warning/error/custom), источник вызова, запись в файл
- 🖱️ Debug camera input: управление камерой кнопкой мыши (или None)
- ⚓ Sprite.anchor: смена якоря без смещения позиции
- 📄 Pages API: страницы умеют управлять спрайтами
- 🎮 EventBus Demo: показ подписки на события и таймеры
- 📣 Стартовый лог: приветственное сообщение с ссылкой на репозиторий
- 🧩 Debug overlay: сетка и HUD могут рисоваться поверх или под сценой
- 🧭 Сетка: шаг 100 по умолчанию, подписи во всех ячейках
- 🛠️ Шаблон проекта: debug включён по умолчанию, стартовый лог
- 🔧 Anchor/FillDirection: переведены на Enum без поломки старого API
- 🧩 Pages demo: сцены и страницы с авто-спрайтами
- 📚 README: полный список ссылок на всю документацию
- 🧪 Reactive example: добавлен пример с Blinker
- 🏓 Ping Pong: очки начисляются корректной стороне
- 🖼️ Sprite.set_image: пустая строка не вызывает предупреждение
- 🖱️ DraggableSprite — drag-and-drop компонент на базе Sprite
- 🎮 Новая демо-сцена: drag_drop_demo.py
- 📚 Документация:
docs/draggable_sprite.md+ обновлены индексы - 🧭 Debug Overlay — сетка мира, координаты камеры и логи
- 🎮 Новая демо-сцена: debug_overlay_demo.py
- 📚 Документация:
docs/debug.md
- 🧩 Button: текст синхронизируется по активности и sorting_order
- ⌨️ InputState в стиле Unity:
is_pressed,was_pressed,was_released,get_axis, состояние мыши - 📣 EventBus для подписки на события (
quit,key_down,key_up,mouse_down,mouse_up) - 🧩 Scene/SceneManager для управления экранами (меню/игра/пауза)
- 📦 ResourceCache (LRU) для текстур и звуков +
load_texture/load_sound - 🧪 Новые демо: ввод/события, сцены, кэш ресурсов
- 🔧 Рефакторинг ядра: камера и контекст вынесены из
__init__.pyв отдельные классы - 🔄 API событий: список событий pygame доступен как
s.pygame_events - 📚 Документация: добавлены
docs/input.md,docs/game_loop.md, обновлены индексы и README
- 🔧 Версия пакета обновлена до 1.0.3
- ✨ Система сохранения/загрузки - Профессиональная система для сохранения игровых данных
- Поддержка JSON, Pickle, Text, Binary форматов
- Автоматическое определение формата по расширению
- Сжатие данных (gzip)
- Автоматические резервные копии
- Thread-safe операции
- Сериализация пользовательских классов
- Обработка ошибок и логирование
- Интеграция с существующими SpritePro объектами
- 📚 Полная документация системы сохранения/загрузки (docs/save_load.md)
- 🗺️ Roadmap проекта (ROADMAP.md) — планы развития
- 🔧 Технические спецификации (TECHNICAL_SPECS.md) - детальные спецификации планируемых функций
- 🤝 Руководство по участию (CONTRIBUTING.md) - как внести вклад в проект
- 🎮 Идеи игр и примеров (GAME_IDEAS.md) - коллекция идей для демо игр
- ⚡ Руководство по производительности (PERFORMANCE.md) - стратегии оптимизации
- 📖 Индекс документации (DOCUMENTATION_INDEX.md) - полный указатель документации
- 🎯 Простой пример использования (save_load_example.py)
- 🎮 Комплексная демонстрация (spritePro/demoGames/save_load_demo.py)
- 📦 Обновлен utils/init.py - экспорт новых функций сохранения/загрузки
- 📝 Обновлен README.md - добавлены ссылки на новую документацию
- 🔒 Thread-safe операции - безопасность при многопоточном доступе
- 📊 Логирование - подробное логирование всех операций
- 🛡️ Обработка ошибок - корректная обработка всех возможных ошибок
- 🗜️ Сжатие данных - опциональное сжатие для экономии места
- 🎮 Базовая система спрайтов - Основа для всех игровых объектов
- 🎯 GameSprite - Расширенные спрайты с игровой логикой
- ⚡ PhysicSprite - Спрайты с физическим моделированием
- 🖱️ Система кнопок - Интерактивные UI элементы
- 🔄 ToggleButton - Переключатели и чекбоксы
- 📝 Система текста - Рендеринг и управление текстом
- 🎬 Система анимации - Покадровая анимация и состояния
- 🌊 Tweening система - Плавные переходы и easing
- ⏰ Система таймеров - Управление временем и событиями
- ❤️ Система здоровья - HP, урон, лечение
- 🖱️ Mouse Interactor - Обработка мыши и hover эффектов
- 🎨 Surface утилиты - Работа с поверхностями
- 🌈 Цветовые эффекты - Динамические цвета и анимации
- 📊 Text FPS - Готовый счетчик FPS
- 🎯 Basic Demo - Основы работы со спрайтами
- 🔘 Button Demo - Интерактивные кнопки
- 📝 Text Demo - Работа с текстом
- 🎬 Animation Demo - Система анимации
- 🌊 Tween Demo - Плавные переходы
- ⚡ Physics Demo - Физическое моделирование
- 🔄 Toggle Demo - Переключатели
- 🌈 Color Effects Demo - Цветовые эффекты
- 📊 FPS Camera Demo - Камера и FPS счетчик
- 📚 Полная документация всех компонентов в папке
docs/ - 🎯 Примеры использования для каждого компонента
- 🎮 Демо игры с исходным кодом
Added- новые функцииChanged- изменения в существующей функциональностиDeprecated- функции, которые будут удалены в будущих версияхRemoved- удаленные функцииFixed- исправления ошибокSecurity- исправления уязвимостей
- ✨ Улучшенное Kivy-лобби (
use_lobby=True,platform="kivy") с поддержкой мобильного режима и удобным десктопным тестированием. - ✨ Автозапуск нескольких Kivy-процессов с лобби при
multiplayer_clients>1— каждый процесс = отдельный игрок, для локального теста мультиплеера. - 🎨 Перевод лобби на flex-лейауты SpritePro (
layout_flex_column/layout_flex_row) для аккуратного расположения полей, кнопок и статуса. - 📚 Обновления документации по
use_lobby=True, Kivy-режиму и демоthree_clients_move_demo.
- Полноценная система управления предметами
- Drag & Drop интерфейс
- Категории и фильтрация предметов
- Слайдеры и прогресс-бары
- Выпадающие списки
- Модальные окна
- Система тем
- Эмиттеры частиц
- Готовые эффекты (огонь, дым, взрывы)
- Физика частиц
- Оптимизация производительности
- Ветвящиеся диалоги
- Портреты персонажей
- Анимированный текст
- Интеграция с системой квестов
- Клиент-серверная архитектура
- Синхронизация состояний
- P2P соединения
- Онлайн сервисы
Примечание: Даты в формате YYYY-MM-DD. Версии следуют Semantic Versioning.
Легенда эмодзи:
- ✨ Новые функции
- 🐛 Исправления ошибок
- 📚 Документация
- 🎮 Игры и примеры
- ⚡ Производительность
- 🔒 Безопасность
- 🎨 UI/UX
- 🔧 Техническое