Игры
Сэм Спейд
5327

Разработчик платформера VVVVVV открыл доступ к исходному коду игры Материал редакции

Терри Кавана выложил на GitHub как мобильную, так и ПК-версию — в честь десятилетия своей работы.

В закладки

VVVVVV — платформер, который рассказывает о космическом корабле, потерпевшем бедствие. Из-за него команда оказывается запертой в разных отсеках, а на их спасение отправляется капитан судна, Виридиан.

Критики высоко оценили VVVVVV — рейтинг ПК-версии на Metacritic составил 81 балл. До 2017 года игру портировали на мобильные платформы, а также на Nintendo 3DS, Switch, PS4 и PS Vita.

Как отметил Терри Кавана, в исходном коде VVVVVV можно увидеть, какие ошибки и просчёты он допустил, когда только начинал разрабатывать игры, а также понять, как сказалось портирование платформера с Flash на C++.

Так, при использовании Flash возникали трудности с доступом к внешним данным, из-за чего все уровни VVVVVV экспортируются в игру через редактор карт. Кавана добавил на GitHub код этого редактора, однако для его запуска требуются компиляторы Allegro и Mingw, поэтому разработчик создал альтернативный инструмент для экспорта уровней.

В честь десятилетия VVVVVV разработчик Серхио Корнага предложил поклонникам игры создать для неё новые уровни — все желающие могут использовать для этого бесплатный редактор Make and Play, который Терри Кавана выпустил в 2014 году.

Терри Кавана выпустил помимо VVVVVV ещё две игры — в 2012 году разработчик представил минималистичный экшен Super Hexagon, а в 2019 году — «рогалик» Dicey Dungeons.

{ "author_name": "Сэм Спейд", "author_type": "editor", "tags": ["\u043d\u043e\u0432\u043e\u0441\u0442\u0438","vvvvvv"], "comments": 48, "likes": 106, "favorites": 66, "is_advertisement": false, "subsite_label": "games", "id": 92297, "is_wide": false, "is_ugc": false, "date": "Fri, 10 Jan 2020 20:11:22 +0300", "is_special": false }
(function(d, ver) { var s = d.createElement('script'); s.src = ((location.host === 'dtf.ru') ? 'https://dtf-static-bf19cf1.gcdn.co/static/build/dtf.ru/specials/RocketBankSummary/js/all.dtf.min.js?' : 'https://dtf.k8s.osnova.io/static/build/dtf.k8s.osnova.io/specials/RocketBankSummary/js/all.dtf.min.js?') + ver; s.async = true; var container = d.getElementById('rocket-bank-summary'); if (container) { s.onload = function() { new RocketBankSummary.Special({ container: container, location: 'article', share: { url: '', title: '', } }); }; } d.body.appendChild(s); })(document, 46);
0
{ "id": 92297, "author_id": 50884, "diff_limit": 1000, "urls": {"diff":"\/comments\/92297\/get","add":"\/comments\/92297\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/92297"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64953, "last_count_and_date": null }
48 комментариев
Популярные
По порядку
Написать комментарий...
93

У него там свитч на 4к кейсов 
('._.)

Ответить
20

Ну да, ну да, можно ведь иначе.

Ответить
3

Хз, имхо, конечно, но даже в таком стиле будет лучше: там любое исправление может сломать что-нибудь в самом неожиданном месте.

Ответить
14

Спорно, потому что в случае с кодом который щас его хотя бы понять легче, а с кодом в "ООП" стиле порог входа до небес поднимается и там черт ногу сломит.

Ответить
7

А если не использовать мемасики как аргумент? У ООП свои плюсы и фабрики не на пустом месте возникли. Вот элементарно: найти как связаны состояния в таком коде то ещё удовольствие, даже если ты один это программируешь. А если несколько человек? Кто-то где-то воткнул state+=10, и удачи выяснять почему у тебя при телепортации персонажа внезапно взрывается корабль.

Ответить
1

 А если не использовать мемасики как аргумент?

Дискуссия скучной станет, а так хоть и над мемами покекать, и обсудить интересное.

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

Ответить
3

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

Интерфейсы,  стремление к SOLID (не забывая о KISS) и модульность это минимальный мастхев, который очень тяжело оспорить.

Разве что, в случаи с вот такими платформерами, наверное, можно забить. Иногда. Но лучше не забивать, а то потом при малейшей модификации будет каскадный эффект из багов и дерьма на голову, который будет в разы сложнее закрыть без нормальной архитектуры.

Разделение сложной задачи на мелкие тестируемые части это тру, а стрельба по воробьям из БФГ нет, это разумеется.

Ответить
0

Тут соглашусь, даже в CSS верстке соблюдается модульность (БЭМ, OOCSS), так что это мастхэв в любой системе крупной.

Ответить
0

Это рекомендации, а не правила. Программирование не заканчивается на ООП. Ничто не мешает писать на современных языках в процедурном стиле, да и большая часть проблем там на самом деле надумана.

Ответить
9

Я хотел выразить мнение что код лютое говно, но побоялся что заминусят и начнётся "сперва добейся".

Ответить
–2

Ну чувак в очень удачное время с парой игр выскочил, выехав на волне инди-хайпа - считай что в лотерею миллиард выиграл, такой фокус он и сам уже не повторит...

Ответить
3

Его Дарси денжен пару дней назад на главной Стима была

и он не просто попал он своим vvvvv создал инди хайп

Ответить
3

Причем тут инди-хайп и везение, он просто талантливый гейм-дизайнер. VVVVVV - один из лучших платформеров своего времени. У него отличные флеш-игры были на Kongregate, тот же Don't Look Back - игра абсолютно потрясающая.

Ну да, говнокод, но кому какое дело? VVVVVV сначала писался на флеше - может так было удобнее портировать с флеша.

Ответить
5

Тот случай, когда можно не бояться, что украдут даже имея на руках исходники

Ответить
3

Поменьше, на самом деле, но да - god function как она есть. Впрочем там и остальное в схожем стиле.

Ответить
0

Вы шарите в программировании? Свич хорош с точки зрения оптимизации?

Ответить
2

Оффтоп: С точки зрения оптимизации надо смотреть как часто будет вызываться эта функция, чтобы оптимизация вообще имела смысл: если, допустим, функция общёта физики, которая вызывается десятки тысяч раз в секунду требует тщательной оптимизации, то машина состояний (которая приведена в примере), которая отрабатывает в лучшем случае десятки раз в секунду, мягко говоря не требовательна к оптимизации, там вполне можно ставить в приоритет читаемость и поддерживаемость.

Онтопик: Конкретные конструкции языка очень слабо влияют на производительность, поэтому без разницы что именно будет использовать if или switch-case.

Ответить
2

Песос.

Ответить
1

SHIIIIIIIIIIIIIIIIIIIIIIIIT

Ответить
0

может что-то автогенеренное

Ответить
0

Это код уровней))

Ответить
0

ну там же редактор уровней есть, как я понял?) Вот эта портянка и есть наверное output этого редактора, которая потом подается как input в саму игру. Вряд ли он руками эти простыни писал) 

Ответить
0

Редактор уровня был написан отдельно, чтобы портировать уровни из Flash.

Ответить
0

Мне очень сложно поверить, что он эти простыни писал и отлаживал руками, но если это так, то это очень сильная грусть

Ответить
0

Вы мой комментарий читали?

Ответить
0

функцию немного раздуло, подумаешь

Ответить
29

Опен Сорс это всегда очень круто. Респект

Ответить
0

Тебя не смущает время?

Ответить
0

В этом и есть смысл шутки?

Ответить
4

Хз, я думал в милом котике. То что время пошло назад - ломает всю шутку.

Ответить
0

Что кот отправился в прошлое?

Ответить
2

...что прошло больше 12 часов (а судя по окну - больше 24)?

Ответить
0

Ну типо почти сутки ждал

Ответить
14

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

Ответить
8

Помню как от балды купил за 3 копейки и очнулся уже пройдя. Странно аддиктивная игра.

Ответить
0

А музон какой зачётный...

Ответить
6

Купил только из-за саундтрека.

Ответить
3

Десять лет. Как вчера играл. 

Ответить
1

Ты вчера и играл. Поменьше делореаном пользуйся.

Ответить
3

Получил игру в первых хамбл бандлах, в своё время понравилась.

Ответить
2

Очень крутые игрушки делает, попробуйте поиграть в super hexagon

Ответить
1

Сам файл длиной 7707 строк говорит о том, что это говнокод)) 

Ответить
1

This engine is super fussy about optimization levels and runtime checks. In particular, the Windows version absolutely positively must be compiled in Debug mode, with /RTC enabled. If you build in Release mode, or have /RTC disabled, the game behaves dramatically different in ways that were never fully documented (bizarre softlocks, out-of-bounds issues that don't show up in tools like Valgrind, stuff like that).

Классика! Почему-то я примерно этого и ожидал.

Ответить
1

какая же отличная игра была, а ost к игре, уух

Ответить
0

Играю в кубики сейчас. Очень неплохо 

Ответить
0

То есть для VVVVV будут выпускать моды, не так ли?

P.S. Может разработчики постарались, но игра как по мне так себе.

Ответить

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovz", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "chvjx", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } }, { "id": 20, "label": "Кнопка в сайдбаре", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "chfbl", "p2": "gnwc" } } } ]