Разработчик представил игру Flappy Dird — это Flappy Bird внутри штатного приложения macOS Finder

от автора

Разработчик Нолен Роялти (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 стал более шатким). Этот опыт побудил меня попробовать сделать что-то большее без игрового движка, так что я продолжу придумывать новые проекты», — подытожил Роялти.


ссылка на оригинал статьи https://habr.com/ru/articles/766208/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *