Разработчик Нолен Роялти (Nolen Royalty) представил открытый проект игры под названием Flappy Dird, написанной на Python и AppleScript. Это аналог Flappy Bird, в который можно играть внутри штатного приложения macOS Finder.
Автор проекта пояснил, что первоначальная идея Flappy Dird возникла, когда он заметил, что в Finder есть поле Date Last Opened («Дата последнего открытия») для каталогов. Он ранее знал, что поле atime (access time - время доступа к файлу) вызывает состояние controversial (обновление индексного дескриптора при каждом чтении файла обходится дорого). Роялти решил пойти дальше и выяснить, как просто получить доступ к данным поля Date Last Opened. В итоге разработчик обнаружил, что:
поле обновляется только при открытии через Finder; cding не обновил метку времени;
поле обновилось, если вы создали символическую ссылку на каталог, а затем дважды щёлкнули эту символическую ссылку в Finder;
поле было доступно (с точностью до второго уровня) через mdls.
«Мне нравится размещать игры в странных местах, и я понял, что могу объединить эти три факта и сделать там кнопку для игры», — пояснил Роялти.
Основная идея механики игры:
создать каталог dir. Внутри каталога создать кнопку каталога, которая будет ссылаться обратно на каталог;
при запуске прочитать временную метку «последнего открытия» каталога;
неоднократно опрашивать временную метку «последнего открытия» и делаьб что-нибудь, когда она меняется;
использовать кнопка «Открыть» (внутри каталога), чтобы изменить временную отметку «последнего открытия», не меняя своего местоположения в Finder.
Разработчик потратил некоторое время на то, чтобы сделать шрифт Finder моноширинным (это помогло упростить работу с ascii) и измерить ширину различных символов ascii в шрифте Finder по умолчанию, прежде чем понял, что у него есть гораздо лучший вариант: смайлы имеют постоянную ширину, и если их поместить в именах файлов, то Finder отобразит их правильно.
В итоге у автора проекта появился рабочий способ принимать клики и рисовать на экране, что уже достаточно для прототипа игры.
Чтобы улучшить механизм отрисовки в игре Роялти использовал Vsync, AppleScript и двойную буферизацию. В процессе своих изысканий разработчик выяснил, что в AppleScript есть способ контролировать работу приложения Finder через определённое значение («PATH» POSIX-файл). Также разработчик переработал часть кода, чтобы выбор любого элемента в окне воспринимался системой как прыжок в игре.
«Я переписал часть кода на Python на AppleScript ради скорости и придумал способ обратного взаимодействия между Python и AppleScript, но это было непросто», — уточнил Роялти.
«Мне понравилось это делать. Одна вещь, которую я нашёл особенно восхитительной, — это то, насколько просто было написать Python для этой игры. Прототип состоял из ~90 строк кода (сейчас ~550 строк, но примерно треть из них — шаблон или константы). Я все это сделал в vim! Никакого щелчка вообще. Было здорово работать без движка и хранить все состояние моего кадра в крошечном 2D-массиве. Было легко держать в голове всю игру от начала до конца (даже несмотря на то, что control flow стал более шатким). Этот опыт побудил меня попробовать сделать что-то большее без игрового движка. так что я продолжу придумывать новые проекты», — подытожил Роялти.
Источник новости: habr.com