Работа с историей и событийное программирование
Git
Структура
Содержимое .git
- …
.git/objects/??/*
- Блобы (файлы)
Деревья (не деревья! это срезы рабочей копии, как файл называется + его id)
- Коммиты: какой блоб из какого получился (в действительности — какой срез из какого) + message + родительский коммит
см. git log -p --full-index
python3 -c "import zlib; import sys; print(zlib.decompress(sys.stdin.buffer.read()).decode())"
но проще openssl zlib -d
- Примеры
⇒ Git хранит все когда-либо бывшие объекты и деревья
Ветки
Базовая статья (читать всю главу)
Деревья — не деревья, а срезы ⇒ ветки — не ветки, а что?
Ветка: именованный путь в графе истории изменений, ссылка на ветку отмечает конец такого пути
git checkout -b ветка / git checkout ветка — приводит рабочую копию в соответствие последнему срезу ветки
HEAD, HEAD^, HEAD^^, …
Merge: объединение историй
К. О.: git merge
- Если наследование прямое, просто передвигается HEAD
- Если есть отдельная история, формируется т. н. merge commit
Если есть интерференция коммитов (conflicts), формируется diff3, который надо исправлять руками
TODO Пример
Rebase: переписывание истории
Переписывание линейной истории с помощью git rebase -i
$EDITOR ☺
- Виды действий с историей
- (пример)
- возможно. потребуется ручное вмешательство
- (пример)
Общее правило: при rebase меняются все коммиты, начиная с первого сделанного изменения (даже если это только reword и он только один)
Статья на Хабре относительно выбора междк merge и rebase
PyGame
PyGame = «обёртка» SDL + атомарность
Поверхностное описание:
Основные объекты: surface.html, rect.html, timer.html, image.html, transform.html, …
- Другие возможности
Событийное программирование
Проблемы алгоритмической полноты «событийного ЯП» в части описания среды порождения, передачи и обработки событий вне объектов этой среды (диспетчера).
Кто-нибудь знает пример такого ЯП?
- Модель:
- среда (игровой мир) = проводник событий + контейнер объектов
- Варианты реализации
- Предазданная среда + обработчики событий в объектах (+ средства подписки на события)
- Моделирование среды с помощью «цикла разбора событий» (mainloop)
Pygame и событийное программирование
- Понятие «игровых часов» (tick)
- Классическая организация игрового времени: таймер
- «доделать всё и подождать тика»
- Работает на медленных платформах, просто медленно
- Современная организация игрового времени: такт
- «тик — это событие»
- Накопление / сброс необработанных событий
- Классическая организация игрового времени: таймер
- Образующий цикл игровой модели
- Определение адресата события
- Обработка низкоуровневого события (немедленная)
- Активность объектов (возможно, немедленная)
- Изменение игрового мира (каждый tick)
- Отрисовка игрового мира (возможно, немедленная)
Пример (TODO переделать): https://github.com/FrBrGeorge/PyGame/tree/Fixupped
Д/З
- Прочитать и прощёлкать
Про ветвление в учебнике по Git
Две методички по PyGame (введение и пришиби макаку)
TODO
Задача на PyGame:
TODO Склонировать тестовый репозиторий/* Пример */
- Реализовать гравитацию (это просто приращение скорости)
- Написать класс «вращающиеся шары разного размера» на базе основного класса
можно использовать transform.html
- поворачивать и масштабировать лучше каждый раз исходное изображение
- Реализовать соударение
- просчитывать соударение нескольких не нужно
поскольку шар круглый, при принятии решения о соударении можно использовать знание о диаметре шара, в общем случае удобнее pygame.mask
- Коммиты оформлять сообразно дисциплине, описанной в прошлой лекции
- Опубликовать склонированный репозиторий
- (Когда будем изучать инфраструктуру, в Д/З войдут pull-реквесты)