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 ()

В частности, автор обращает внимание на конечный автомат с 309 состояниями, реализованный через switch и 309 case

Как будто в этом есть что-то постыдное. Гораздо хуже, когда профессиональные (== работающие за зарплату) программисты реализуют конечный автомат с помощью кучи вложенных ифов, проверющих булевые флаги

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

Уже почти привык что инди гамка это всегда ну такое но они это ещё и продают?! wtf?

Наверно дело в том, что только инди-хуинди и могут придумывать значимые сюжетом игры? А остальные «ААА» идут надстройками и «вылизыванием» над ними, не думал? А целая индустрия и раздел в steam’е тебе тоже ни о чём не говорит? Ты в курсе, например, что стример может поднять 70 кусков рубасов за 6 часов своей работы, и это не за майнкрафтолайфхаки? Короче, я думаю, что ты очень глупый, и тебе либо мало лет, точнее в жизни твоей больше тех лет, которые ты прожил вдалеке от цивилизации и мэйнстрима. Но ты теперь об этом всём знаешь, и больше можешь не позориться со своими сообщениями. Всех благ, антошка.

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

Чтобы бложик нельзя было открыть со старых устройств с устаревшими серфикатами и/или устаревшей поддержкой протоколов SSL

fixed

annulen ★★★★★ ()
Ответ на: комментарий от question4

получение сертификата - одна консольная команда, на которую тратится 5 секунд. абсолютно бесплатно, дальнейшее обновление сертификата происходит автоматически

HTTPS нужен для передачи личной и денежной информации

это заблуждение. в современном мире любая информация, передаваемая через интернет, должна быть зашифрована

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

Чтобы бложик нельзя было открыть со старых устройств с устаревшими серфикатами и/или устаревшей поддержкой протоколов SSL

Таких вообще надо отлавливать с собаками и топить в огромных чанах с дерьмом.

AVL2 ★★★★★ ()

лицензия запрещает коммерческое использование

а так хотелось…

vitalif ★★★★★ ()

на секунду подумал что юбилей у UVV.

splinter ★★★★★ ()

Я бы и 10 лет назад постеснялся такое продавать.

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

Я бы и 10 лет назад постеснялся такое продавать.

Поэтому он заработал свои копейки, а ты нет. О его творении тут уже 3 страницы, а о твоих творениях здесь вообще никто не знает.

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

Полковник Захарченко тоже заработал свои копейки. И про его деятельность тоже многие говорили. Но это же не значит, что это хорошо.

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

не хорошо что «И про его деятельность тоже много говорили» - ага. кому ли не знать.

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

Полковник Захарченко тоже заработал свои копейки. И про его деятельность тоже многие говорили. Но это же не значит, что это хорошо.

Ты не понимаешь термина «заработал»? Устраняй сам свои проблемы в образовании.

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

У него проблемы не с образованием, а с восприятием окружающей действительности.

grem ★★★★★ ()
Ответ на: комментарий от annulen

Чтобы бложик нельзя было открыть со старых устройств с устаревшими серфикатами и/или устаревшей поддержкой протоколов SSL

Кстати, и наоборот. Чтобы новым браузером нельзя было открыть старый сайт. У меня в виртуалке WinXP стоит для настройки коммутатора. Потому что только https, а все современные браузеры посылают лесом, так как то шифрование уже не поддерживается.

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

Таких вообще надо отлавливать с собаками и топить в огромных чанах с дерьмом.

Кого? Старые устройства? Их владельцев? Или владельцев бложиков с HTTPS?

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

какой смысл в этом?

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

У меня есть проект которым я горжусь. Потому что он приносит пользу конкретным людям. Что не означает, что я горжусь тем кодом, который там. Коду тоже больше 10 лет уже, до сих пор собирается без танцев с бубном ;-)

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

Не делать бессмысленную работу.

Смысл в том, что сперва опсосы вставят тебе скриптов в аналы твоего http/html, а потом выяснится, что ты подписан на контент с жёстким гей-копро-порно через смс за 250рублей в секунду.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

а потом выяснится, что ты подписан на контент с жёстким гей-копро-порно через смс за 250рублей в секунду.

Для этого, наверное, надо отправить СМС?

А в остальном, опсос и так может соединиться на https сайт от имени любого из своих клиентов. Чем https-то поможет?

Или «подписан» будет владелец хостинга с http сайтом? Тогда каким образом?

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

Для этого, наверное, надо отправить СМС?

Нет. Достаточно перехода по http. Да, это незаконно, даже деньги возвращают, но всем насрать. Тебе вернули у тысячи васянов списали.

А в остальном, опсос и так может соединиться на https сайт от имени любого из своих клиентов.

Опсос не настолько обнаглел. Подписка происходит по факту обращения по http на какой-нибудь говносайт. Обращение делается через рекламную сеть, которую вкорячивают тебе в http. В https нельзя вкорячить сеть, если её там нет.

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

Да, так и есть, геймдев не про чистый прилизанный расово верный код.

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

Все так и есть, работал в геймдеве.

У большинства проектов просто ужасный legacy код, документации нет. Часто на таких проектах уже и не работают люди, которые писали проект ранее, так что ответить почему Васян написал код так, некому и приходиться разбираться в говнокоде самому.

А часто ещё и времени не дают, чтобы отрефакторить такой говнокод, чтобы он читабелен и понятен другим людям.

anonymous ()

конечный автомат с 309 состояниями, реализованный через switch и 309 case

Gamedev , который мы заслужили.

constin ★★★ ()

А, это от автора хексагона тогда все понятно :D

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

Тех, кто вцепился в устаревшее говно и просто тормозит прогресс. Таких надо маргинализировать, криминализировать и отправлять на марс, в колонии, на урановые руднеги.

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

Ну и сопровождай свои N-сколько экранов в одном файле, если не влом :) Разве что ты выучишь джва новых слова fine и grained

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

а для какой нужной платформы нет GCC, приведи пример

Harald ★★★★★ ()
Ответ на: комментарий от AVL2

Больше «прогресса» богам прогресса!!!

Владимир (другой).

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

Ну например можно так:

struct object_base {
	int x;
	int y;
	void (*use)(struct object_base*, struct player*);
};

struct object_door {
	struct object_base base;
	bool locked;
};

struct object_teleport {
	struct object_base base;
	struct point target;
};
Или так:
enum game_object_type {
	GAME_OBJECT_TYPE_DOOR,
	GAME_OBJECT_TYPE_TELEPORT,
}

struct game_object {
	enum game_object_type type;
	bool locked;
	struct point target;
};

void use(struct game_object *object, struct player *p) {
	switch(object->type) { ... }
}

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

У нищих слуг нет – иди и гугли :) Алсо, кое-где оно есть, но или никак не поддержано девелоперами платформы и «депрекатед» в пользу шланга. А кое-где нативные средства использовать не в пример удобнее.

slackwarrior ★★★★★ ()
Ответ на: комментарий от Diano4kaNyashenka

Ну я бы начал с std::unordered_map<Point, Point> teleports, а потом, если надо, ввел бы class Teleport вместо Point в map value. Data oriented design для игр рулит. Идеальный код игры - это игровой движек, на котором могут клепать игры всякие некодеры.

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

Идеальный код игры

Тот которого нету, рулит визуальное программирование. Та же Scirra Construct, на ней такую игрушку (не буду говорить про все уровни) можно сделать за час максимум, при наличии готовых спрайтов.

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

HTTPS нужен для передачи личной и денежной информации.

Что же это мне перед заходом на каждый URL думать, а не собираюсь ли я оставлять там личную или денежную информацию, с учётом, что сам факт посещения ресурса может быть таковой? Как-то, знаете, лень. Пущай лучше процессор байты помолотит, он железный, ему всё равно.

ugoday ★★★★★ ()
Ответ на: комментарий от StalinEXE

портировать на новые платформы

NiCALIS сразу C&D-люлей дадут

iSage ★★★★ ()

Лицензия запрещает коммерческое использование. Музыка и спрайты остались несвободными

По второй фразе наивный читатель может подумать, что лицензия на код свободная (нет)

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

Квадратно-гнездовые любители чего угодно ваяют говно :) Когда за говно берутся типа свича на 100500 экранов – прост сил меньше тратят.

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

Что самое интересное, если взять продвинутый ЯП с АДТ (например раст), то паттернматчить аки свитчить неожиданно становится хорошо. Правда паттернматчинг - это обычно не про магичиские числа. У него есть дополнительная фича привязывать произвольные данные к индивидуальным вариантам. Ну и незачем плодить один матч на много экранов, если можно организовать проверки по категориям и вынести паки веток в отдельные функции

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

существует область реализаций на Сях где обозримая тупость лобового свича на много-много экранов понятней(и простить) косвенность-через-косвенность соответствия состояние<->экран+что_ещё

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

ззы. окончательная теорема и её доказательство не опримальна при поиске исходного доказательства - ака сырец тупой по обзору бывает проще менять чем итоговщ_оптимальный ака произведение_искусство_на_радость_потомкам

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

Берётся 0-day, втыкается кому надо через MitM провайдером, какой-нибудь клон пети шифрует все данные нечегоскрывателя, а потом начнётся.

Ну или по указке от кого надо, с помощью того же зеродея, подкинут какой-нибудь экстремизм или цп, а потом устроят проверочку. И нечегоскрыватель отъезжает на несколько лет. Зато процессорные ресурсы зря не тратятся!

anonymous ()

продолжая тему оптимального чёрного ящика конечного автомата.

задача из дискретки так выбрать набор чисел(кода состояний) и функцию перехода на дополнительных аргументах) чтобы вот.

возможно уже существуют полуавтоматические солверы которые могут утрамбовывать вышеуказанные критерии в лаконичные наборы инструкций - если конечно это не эквивалентно задаче останова.

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

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

Конечно, вызов функции strlen находится в условии макроса assert, поэтому он будет выполняться только в отладочной версии

Вот только отладочная версия — единственная рабочая. Всё правильно подмечают.

Переменные totalflips и hardestroomdeaths имеют целочисленный тип, и поэтому присвоить в них результат функции atoi – совершенно нормально. Но что будет, если присвоить целочисленное значение в std::string? Оказывается, с точки зрения языка такое присвоение совершенно валидно. В итоге в переменную hardestroom будет записано какое-то непонятное значение!

ЕМНИП, определение сложнейшего экрана работало странно. Теперь понятно :)

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