Публичный репозиторий Git. PyGame
Git
Повторение: рабочий процесс
git init
- Hack
git add …
git commit
- Использование $EDITOR
- Использование IDE
- goto (1.)
Что внутри:
- Хранятся все файлы (упакованные)
$ git init $ find . $ cal > CAL $ git add . $ find . # 1 object $ git commit -m "Init" $ find . # 3 objects
- 3 типа файлов:
- blob (сам файл)
- commit (коммит)
- tree (состояние файлов в копии на момент коммита)
- Дампер:
Деревья:
- параллельная разработка
- разные версии
- Где:
$ git branch [-v [--abbrev=0]]
- BTW abberv
оно же .git/refs/heads/master
- это ссылка на commit object
- сделаем
$ git branch old $ git branch -v $ git checkout old # рабочая = old $ git reset --hard HEAD^ # или любой commit-ish, например, commit id
Есть опасный путь: запомнить HEAD + reset --hard (объекты не удаляются, пока не вызван [re]pack (и потом обратно reset на этот commit)
Публичный репозиторий
Взаимодействие типа «pull»
(GH: создать репозиторий на GH, а потом git clone)
Опубликовать: git push
- обновить все объекты в удалённом репозитории
Синхронизировать с опубликованным (git pull): составная операция
Забрать все объекты git fetch
Объединить историю ветки, если она локально поменялась git merge
BTW: при слиянии веток та же операция merge
- Конфликты
Виды публичных репозиториев: HTTP/HTTPS:, GIT:, локальный, SSH:
- локальный:
clone/fetch любого репозитория
push (а если в этом время там над локальной копией люди работают?)
⇒ --bare (узнаёте?)
Событийное программирование
Концепция:
- Вселенная: время, объекты, события
- Объекты: обработчики событий
Проблемы:
- «синхронность / асинхронность»
- параллелизм
- программирование вселенной
- Инструмент написания 2D (и отчасти 3D) игр, фактически, оболочка над SDL
- SDL устарел, есть pysdl2. но…
- Простая модель обработчика событий с помощью т. н. mainloop
- Единая очередь событий
Пример:
Ручной разбор событий:
1 import pygame
2 from random import randrange
3 pygame.init()
4 screen = pygame.display.set_mode((800, 600))
5
6 SZ = 100, 80
7
8 windows, nwin = [], 0
9 while True:
10 evs = pygame.event.get()
11 for e in evs:
12 if e.type is pygame.QUIT:
13 print("QUIT")
14 break
15 if e.type is pygame.MOUSEBUTTONDOWN:
16 if e.button == 3:
17 color = pygame.Color(randrange(100,256), randrange(100,256),randrange(100,256))
18 windows.append((nwin, color, pygame.Rect(e.pos, SZ)))
19 nwin += 1
20 else:
21 for (i, color, rect) in reversed(windows):
22 if hasattr(e, "pos") and rect.collidepoint(e.pos):
23 print(f"{e} to {i}")
24 break
25 else:
26 print(e)
27
28 else:
29 screen.fill(0)
30 for i, color, rect in windows:
31 screen.fill(color, rect)
32
33 pygame.display.flip()
34 continue
35 break
Проблема: время вселенной:
- 100% cpu
- ⇒ ticks
Как:
1 time.set_timer(USEREVENT, timeout)
Теперь можно использовать ev = event.wait() и даже (с бооооольшой осторожностью) какой-то параллелизьм
Д/З
- Доработать этот код до использования таймера
- Сделать так, чтобы по левой кнопке в окне (не не за его пределами) рисовалась линия
- WARNING: этот (и предыдущий) код надо будет публиковать