LINUX.ORG.RU

К юбилею VVVVVV автор открыл исходники

 ,


1

3

10 лет назад вышла игра VVVVVV — инди платформер-головоломка в 8-битном стиле с красивой чиптюнной музыкой и необычным управлением — вместо прыжков герой меняет направление гравитации. Первая версия была на флеше, затем автор портировал игру на C++ и SDL. Игра получила немало хороших отзывов и, вроде, была чем-то награждена.

По случаю юбилея 11 января автор выложил исходные тексты на Гитхаб: https://github.com/TerryCavanagh/vvvvvv Доступны 2 версии: «desktop_version» на C++ — именно она продаётся в Humble Bundle, GOG.com и Steam — и «mobile_version» — форк флешовой версии, из которого собраны игры на Air для iOS и Android.

Лицензия запрещает коммерческое использование. Музыка и спрайты остались несвободными. Главная цель открытия — показать, что можно сделать хорошую игру, не будучи хорошим программистом. В частности, автор обращает внимание на конечный автомат с 309 состояниями, реализованный через switch и 309 case: https://github.com/TerryCavanagh/VVVVVV/blob/f7c0321b715ceed8e87eba2ca507ad2dc28a428d/desktop_version/src/Game.cpp#L612 Главное — не сдаваться.

Новость на OpenNet: http://www.opennet.ru/opennews/art.shtml?num=52168

>>> Блог автора

★★★★★

Проверено: a1batross ()

Ответ на: комментарий от anonymous

википедия

предлагается сделать понятие «состояние» первичным, а в качестве языка спецификации для описания алгоритмов применять графы переходов — предлагается представлять программу как систему взаимодействующих конечных автоматов, описываемых графами переходов. Другими словами, первоначально описывается поведение управляющего устройства, а не его структура, а построение алгоритмов и программ начинается с формирования состояний.

При использовании Switch-технологии программы (их схемы) должны строиться, начиная с дешифратора состояний, а не с дешифратора входных воздействий, как это делается при использовании других стилей программирования[6].

В качестве основного документа, определяющего структуру программы, как и при автоматизации технологических (и не только) процессов, в Switch-технологии используется схема связей[3]. Она может совмещаться со схемой взаимодействия автоматов.

Схема связей определяет интерфейс автоматов и позволяет применять в графах переходов и в реализующих их программах символьные обозначения. Для объектно-ориентированных программ с явным выделением состояний диаграммы классов в рамках рассматриваемого подхода изображаются в виде схем связей

Графы переходов реализуются формально и изоморфно, например, с помощью конструкции switch (например, языка Си) по соответствующим шаблонам (поэтому предлагаемый подход был назван «Switch-технология»).

В конструкции switch используются символы входных и выходных воздействий, а не функции их реализующие, которые размещаются отдельно. Такая декомпозиция упрощает понимание логики программы за счет компактного её представления и соответствует правилу «отделения логики переключения от деталей того, что происходит»[13].

Для каждого автомата создается четыре документа: словесное описание алгоритма (декларация о намерениях), схема связей, граф переходов, изоморфная реализация.

Реализация выполняется так, что в каждом программном цикле или при каждом запуске автомата в нем выполняется не более одного перехода. Это делает номер каждого состояния автомата доступным для его «окружения» и позволяет не вводить новых переменных для обеспечения взаимодействия автоматов

anonymous ()
Ответ на: комментарий от anonymous

ну то есть, он в один switch запихал несколько взаимодействующих автоматов? которые должны были быть отдельными?

anonymous ()
Ответ на: комментарий от monk

А что поменялось бы, если бы он описал этот же код пачкой структур-состояний?

структур-состояний или там и логика другая (хоть какая нито), если её в SWITCH-технологии описывать?

anonymous ()
Ответ на: комментарий от eternal_sorrow

чтобы кешировалось нормально на прокси хотя бы

anonymous ()

Блог автора

One more: as well as the cutscene parser, I had another way to control game logic as you were playing – a monolithic state machine, which had gotten completely out of control by the end of the project! You can find it in Game::updatestate, and I kinda recommend checking this out even if you don’t read anything else! This controls things like triggering the start of more complicated cutscenes, where teleporters send you, the timing of the level completion animation, and other miscellaneous things that I just wanted to kludge in quickly. The states are numbered, and it counts all the way up to 4099, with gaps. When I was developing the game, I kept a notepad nearby with the important numbers written down – 1,000 triggers the collection of a shiny trinket, 3,040 triggers one particular level completion, 3,500 triggers the ending. This dumb system is the underlying cause of this amazing 50.2 second any% speedrun of the game.

Looking back through it myself all these years later, I find it really funny how much of it is basically just the same parts copy and pasted over and over, with the values changed. This basically makes it impossible to read and maintain ten years later, but back when I was in the thick of it, it made it really fast to iterate and add new things. I’ve gained better habits over the past decade, and I’m definitely a better programmer now – but it does seem to take me longer to do things.

ну то есть, всё-таки правильно А. А. Шалыто пишет про SWITCH-технологию и движение про открытую проектную документацию

вот что случается, когда вместо понятной документации и спецификаций пишут «записки на манжетах». этот monolitic switch работает, но хз как.

тут кстати, и игры тоже есть. и думается – документация понятнее в таком виде :)

про метапрог, кстати

любопытственно… отрефакторить бы это VVVVV в SWITCH-технологию с Literate Programming, будет огонь (заодно и повод попробовать groff с unicode и макросами MOM, почти как LaTeX)

anonymous ()
Ответ на: комментарий от anonymous

про метапрог, кстати

=> """ Маленькая история по созданию логической части программы.
Летом 2003 года (в самый разгар работы), из группы АСУ ушел один из двух специалистов, занимавшихся разработкой алгоритмнов (автор статьи был молодым специалистом и руководителем программной части всего проекта). На его место пришел молодой человек, только что окончивший институт. Выяснилось, что он если и программировал что-то в своей жизни, то только в институте для сдачи зачетов, явно не фанат этого дела и больше тяготеет к схемотехнике. Более того, новый сотрудник ничего не знал о LabVIEW… Пара дней ушло на ознакомление с проектом. После этого автор статьи предложил ему заняться программированием (благо к этому времени практически все алгоритмы были готовы, и не терпелось посмотреть, что получится когда они будут реализованы программно).
Так вот этот молодой человек ЗА ОДНУ РАБОЧУЮ НЕДЕЛЮ (пять дней) освоил LabVIEW (пускай поверхностно, и только те моменты, которые были необходимы) и запрограммировал ВСЕ ТЕХНОЛОГИЧЕСКИЕ АВТОМАТЫ и АВТОМАТЫ УПРАВЛЕНИЯ ПИТАНИЕМ ПРИБОРОВ (25 автоматов) – практически всю логику проекта.
Как же это? Почему так просто?
Повторимся: при использовании предлагаемого подхода вся сложность заключается только в СОЗДАНИИ АЛГОРИТМОВ, а ПРОГРАММИРОВАНИЕ ЛОГИКИ – ПРОЦЕСС РУТИННЫЙ, требующий от исполнителя лишь ВНИМАТЕЛЬНОСТИ и УСЕРДИЯ. Строя автоматы, Вы по существу создаёте программу.
"""

опять же, что мешает эти модельки (рис. 2,3 – 45) рисовать автомагически в какой-то WEB среде грамотного программирования, да хотя бы тот же groff + pic + dot + MOM пакет макросов в стиле LaTeX?

только то, что это «текстовое» программирование, ога. а должно быть гипертекстовым, литературным и грамотным.

anonymous ()
Ответ на: комментарий от anonymous
  1. При программировании логики применялся конвертор графа переходов, изображенного с помощью Visio, в текстовый код программы (кстати, **конвертор также был создан на LabVIEW). Такая возможность существует именно благодаря формальному переходу от графа переходов к коду.
  1. Так как программирование логики не требует никакого участия человека (требуется только запустить конвертор и скопировать запущенный код в LabVIEW), то …

хвалёный метапрог сам на себе. ну то есть, на графическом LabVIEW. в текстовый LabVIEW (тут у метапрогеров случается ВНЕЗАПНО, разрыв шаблона).

anonymous ()
Ответ на: комментарий от anonymous

рис. 48. Обыкновенная подпрограмма – входы (1), обработка в текстовом виде (2) и выходы (3)

во, блин! оно самое!

когда мы у метапрогеров увидим что-то подобное (2) в «блочёчках с проводочками»? никогда?

anonymous ()
Ответ на: комментарий от qulinxao3

зы. отдельный вопрос какая реализация для варианта из vvvvvv оптимальнейшая по фен-шую.

switch-технология от Шалыто А. А.?

anonymous ()
Ответ на: комментарий от qulinxao3

в какую математическую структуру, lattice, решётку с частичным упорядочиванием ты хочешь уплощая размостить и уложить линеаризацию: проекцию, срез многомерной гиперструктуры, гиперграфа? и как при этом устроены правила упорядочивания, принципы выбора при оптимизации, преобразования и гомоморфное вложение?

anonymous ()
Ответ на: комментарий от qulinxao3

зы. битовые строки

чего? трансфинитных tumblers для адресации в гиперграфах?

anonymous ()
Ответ на: комментарий от qulinxao3

алсо любопытственно нужны ли GADT и паттерн матчинг для свитч технологии.

anonymous ()
Ответ на: комментарий от anonymous

я гимназиев не кончаф

речь о очень буквальной вещи - есть битовые строки (гранулированные по 8 для сишечки)

состояние можно метить произвольными 32битностями ( ну 64 или ещё чё не суть)

как разметить состояния что-бы «максимально» упростить на наборе команд С-языка правила перехода состояний (очевидно с логикой ветвления по условиям от всяких макгафинов)

зы. бурбачно ты.

qulinxao3 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.