Программирование

Рейтинг
+0.40
3 читателя , 12 статей
О блоге RSS

Руководство по православному игротворению

Программирование

Предисловие

Сия запись есть скромная попытка воплотить потребный минимум предписаний к игролепке и его вещному претворению в самой что ни на есть бессовестной форме — форме рекомендаций.
Мотивацией к оному, несомнительно богоугодному, занятию послужило великое число баттхкровений, многажды испытанных мною во время внетелесных, иначе «вирхтуальных», контактов с продуктом жизнедеяния скверны в личине Игропрома. Контакты сии заразительны и грешноваты, однако я пред соблазном устоял, духом был твёрд аки камень да члены держал прямыми смолоду, посему глупость исподнюю узрел и покамест момент душевного напряжения не растрачен, деять праведное негодование на пергамент приступаю.

(Прим. переводчика) Дальнейшее повествование было переведено на просторечный рунетский язык для облегчения восприятия преобладающе непросвещёнными разработчиками игр. Материал [возможно] будет дополняться и обновляться по мере нахождения других фрагментов вещей мудрости в месте раскопок на Бумажном завале.

Геймплей

• Избегать «прокачки» — самого дешёвого способа продления длительности игры, путём подмены качества количеством.
★ Хороший левелинг даёт новые возможности, плохой — лишь увеличивает и увеличивает цифры.
• Избегать увеличения сложности игры против компьютерного противника через фору — жульничество с цифрами.
• Избегать несоблюдения внутриигровых законов. Это портит игромеханику и восприятие происходящего.
★ Если игрок ограничен в количестве патронов, то почему противники вместо экономной прицельной стрельбы извергают потоки пуль направо-налево?
• Избегать грубого нарушения законов реального мира.
★ Выстрел в голову приводит к смерти. Нравится вам это или нет. Нет? Тогда замените людей на пустоголовых твердолобов с планеты Черепная Непрошибаемость.
• Действия игрока должны приводить к ожидаемым, прогнозируемым результатам.
★ Диалоги в RPG порой совершенно бессмысленны. Так как предсказать реакцию оппонента на ту или иную реплику не представляется возможным.
• Избегать однотипных побочных квестов, которые отвлекают игрока от основного сюжета, но не дают ничего взамен.
★ Влияние решений принятых в побочных квестах на основной.
★ Использование в побочных квестах уникальных игромеханик отличных от базовой.
• Избегать хождения по одним и тем же локациям туда-обратно.
★ Использовать разные маршруты на одной локации.
★ Существенная смена “наполнения” (врагов, предметов и т.п.) локаций при каждом посещении.
★ Смена атмосферы: времени суток, погоды, интерьера и т.п.
★ Случайные встречи и события.
• Избегать тонн лута, выпадающего из монстров. Не превращать игрока в комбайн по уборке и сортировке мусора.
★ Снижение дропа, за счёт отказа от «простых» предметов, каждый предмет в рюкзаке персонажа будет редким и по-своему хорошим. Также, позволит избавиться от «самых-самых» предметов, убивающих интересность игры, после их нахождения.
★ Система фильтрации лута по заданным критериям.

Нарратив

• Избегать клишированных персонажей. Безликий типаж — не персонаж.
• Избегать неестественного или карикатурного изображения людей. Для человека неестественно:
▸ Рисковать жизнью при любом удобном случае.
▸ Поступать строго в соответствии с кодексом чести в моменты опасности.
▸ Излишнее влияние напускных черт характера и убеждений на реальные поступки.
▸ Безосновательный альтруизм.
▸ Гиперболизированное желание мести.
▸ Безошибочное решение сложных задач с первой попытки, без подготовки.
▸ Знание наизусть энциклопедий и справочников.
• Избегать русской бравады / шапкозакидательства.
• Избегать американского пафоса / мироспасительства.
• Избегать японского выпендрёжа / цитирования мудрецов древности.

Локализация

• Халатное отношение к локализации игры испортило не одну игру. Посмотрев пару выпусков “Трудностей перевода”, понимаешь насколько порой искренний и продуманный оригинал отличается от наигранного и несвязного перевода.
• Субтитры обязательны.
• Переключать язык субтитров без перезапуска игры.
• Избегать при сохранении игры, где возможно, локализованных строк. Где невозможно, использовать универсальную кодировку (UTF-8). Сохранения не должны ломаться из-за смены языка игры.
• Независимо от выбранного языка, уметь отображать любые текстовые символы (Unicode). Особенно, если в игре допускается ввод произвольного текста или есть чат. Или если игра использует локализованные строки в сохранениях.
• Избегать невидимых символов в никах игроков в сетевых играх.

Управление

• Позволить переназначение управляющих клавиш для всех игровых действий. Люди разные, со своими привычками, со своим представлением об удобстве.
• Размещать часто используемые элементы управления в области досягаемости одним кликом.
• Использовать “горячие” клавиши для часто используемых действий.

Игровая сессия

• Запрашивать подтверждение перед началом игры, после загрузки нового уровня или предыдущего сохранения. Игрок может отойти от компьютера на это время.
• Запрашивать подтверждение “быстрой загрузки” нажатием ENTER. Во избежание потери несохраненного прогресса прохождения.
• Не сохранять игру в неправильной ситуации. Например, после смерти игрока.
• Использовать несколько циклично сменяющихся слотов под “быстрое сохранение”. Перезапись одного слота, может привести к потере всего прогресса прохождения из-за невнимательности/горячности игрока.
• Не использовать в качестве клавиш для быстрого сохранения и загрузки те, что расположены рядом. Предпочтителен классический вариант: F5 и F9 соответственно.
• Для неинтерактивных моментов игры (вроде видеороликов или реплик персонажей) разрешить вызов главного меню (ESC), пересмотр (галерея, лог), паузу (SPACEBAR) и, главное, пропуск (ENTER). Причин масса: игрок ценит только механику, ему плевать на сюжет; «заставка» могла быть просмотрена в предыдущее прохождение; игрок не хочет смотреть некоторые моменты в присутствии третьих лиц (родителей/партнёра/детей).

Интерфейс

• Выдача информации (и элементов управления?) по контексту, а не все сразу. Обилие информации, также вредно как и её отсутствие.
• Избегать нагромождения информации на экране. Размещать индикаторы рядом с объектами индикации. Например, полоска здоровья над головой персонажа (если вид от третьего лица), а не в углу экрана.

 

А давайте разработаем формат записи игровых сессий?

Программирование

Увы, в полный экран не разворачивается — надо переходить на Ютуб.
Это видео входит в плейлист аналогичных режимов других игр.

В 80-е/90-е годы, когда в ходу были аркадные автоматы с видеоиграми, в играх делали специальные режим под названием Attraction mode, в котором, чтобы привлечь посетителей залов аркадных автоматов (отсюда и название), игра играла сама в себя, для чего со стороны одного либо двух игроков выполнялись предварительно записанные действия.

Надо отметить (я не знал, пока не поинтересовался плотно), что Attraction mode не всегда включала в себя демонстрацию именно геймплея. Есть ряд игр, где нам показывают таблицу рекордов (High Scores), или предысторию игры (Cutscenes). Robocop 3, например, просто чередует главное меню с рекордами, но трек играет на протяжении около 4 минут, что для NES порядочно много — большинство треков укладывалсь в те сложные времена секунд в 30-40 максимум. Но как это всё делать, я думаю, и так понятно, а вот как заставить игру играть в себя...

Итак, цель поста: Разработать удобный, открытый и свободный формат хранения игровых сессий. Также я для наглядности привёл здесь текущий формат игровых сессий Замка Невозврата 2.

Интересно? Заходите под кат.


Читать дальше...

Бесшовный и (почти) бесконечный космос

Программирование

 

Добрый день, уважаемые коленковчане!

Меня всегда крайне привелкали космические симуляторы (или псевдо-симуляторы) с элементами командно-социального взаимодействия. Не могу похвастаться тем, что я потратил пару месяцев жизни, играя с друзьями в Pulsar: Lost Colony, но сама концепция подобных игр казалась мне крайне привлекательной.

И вот решил я поизучать в свободное время за чашкой кофе всем известный Unity3D. Да чтобы не просто скучно было изучать его, собрались мы с друзьями и решили забабахать свою игру (Миша, Илья, привет вам!).

Начали мы обсуждение космоса, как такового.

Меня лично всегда очень удручала замкнутость и ограниченность космоса в играх. Есть только сектора, в рамках которых можно перемещаться и портал между секторами. Тоска. По сему, решили мы, что космос будет бесшовным и ОГРОМНЫМ.

Основные идеи были следующими:

  • Бесшовный космос в реальном масштабе
  • Космос делится на множество секторов
  • Варп-прыжки между секторами
  • Можно не использовать варп и лететь самому — включил автопилот и пару недель летишь на скорости, близкой к суб-световой, от одной звезды к другой

И естественно первая проблема — это координаты объектов. Масштабы космоса — огромны, а числа в памяти компьютера обладают весьма условной точностью.

Интересно, как это решить? Прошу под кат!


Читать дальше...

Еще раз немного про изометрию, перерасчет координат и вращение камеры

Программирование
 
Добрый день, уважаемые Коленковчане!
 
В этой небольшой статье я хотел бы концентрированно и полностью раскрыть все секреты преобразования изометрических координат в экранные и наоборот, показать реализацию вращения камеры и нескольких мелких нюансов.
 
Всех заинтересовавшихся прошу под кат!

Читать дальше...

Одинаковое разное оружие добра и зла (на примере моей игры Aliens X)

Программирование

В начале своего геймдев-пути я думал, что игру нужно программировать как законы физики, только не той физики, которую обычно понимают в геймдеве — не кинематики, а именно физики. Типа, есть пуля, пуля летает — значит пуля может нанести вред и игроку, и врагу. От меня ускользал тот факт, что в большинстве старых игр игрок не может повредить себя своим же оружием. И тот факт что игр, где у игрока и врага были одинаковые виды оружия — вокруг меня практически не было. Казалось, это так естественно. Не знаю, в силу чего я так думал, но продлилось это не так уж долго.

Когда я открыл для себя Game Maker и попытался сделать игру, подразумевавшую перестрелку игрока и врагов, оказалось — не тут-то было. Тут-то меня и постигли первые приступы охреневания от того, что создание игры != программирование игровой логики. Это ощущалось парадоксальным.

Как говорил Кортех:

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

Как работала система выстрелов в Aliens X:

Был выстрел игрока, были выстрелы врагов, и были выстрелы, которые «ничьи» летают на орбите игрока, задаваемые отдельным путём. Выстрелы врагов превращались в орбитальные выстрелы, а потом, при отпускании правой кнопки, в выстрелы игрока, по фазам способности использования выстрелов врагов против них самих. В ранних версиях игры игрок умел только выкидывать вражеские выстрелы обратно в землю, кстати.

А теперь у меня та же проблема всплывает в нашем совместном Замке Невозврата 2. Но теперь-то я уж давно знаю, как с этим разбираться — достаточно менять и обрабатывать переменную, назвав её как-то вроде side или team.

Ну вот, какой-то такой забавный факт из истории.

4 способа написать код, который меня раздражает (с пояснениями)

Программирование

Если кто-то узнал свой стиль кода (а это неминуемо произойдёт) — учтите, я не писал целенаправленно этот пост, чтобы кого-нибудь потроллить. Что поделать, такова правда! Я просто привожу нерациональные решения, которые встречаю куда чаще, чем мне хотелось бы. И немного гоню на мейнстримные стандарты, но уже под катом.

 

switch-case с константами

Не тортТорт

В работе:

switch (variable)
{
    case 0: text=«raz» break;
    case 1: text=«dva» break;
    case 2: text=«tri» break;
}

Особое извращение — сделать скрипт, который делает только это присваивание.

В инициализации:

text_value[0]=«raz»
text_value[1]=«dva»
text_value[2]=«tri»

В работе:

text=text_value[variable]

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

Случай похуже:

Не тортТорт

В работе:

switch (variable)
{
    case 0: text=«raz» draw_text(0,0,text) break;
    case 1: text=«dva» draw_text(0,0,text) break;
    case 2: text=«tri» draw_text(0,0,text) break;
}

В инициализации:

text_value[0]=«raz»
text_value[1]=«dva»
text_value[2]=«tri»

В работе:

text=text_value[variable]

В рендере:

draw_text(0,0,text)

Копипастить повторяющиеся участки кода это плохо. Практически везде и всегда. Чем конкретно? Если вы захотите поменять действие, которое происходит после вычисления, то вам придётся поменять каждую ветку case. А если их 10? 50?

 

Фигурные скобки с одним условием для одной команды

 

if (condition)
{
    i=0
}

Зачем? Обычной индентации (отбивки) ведь вполне достаточно.

А вот дальше уже начинается жесть.


Читать дальше...

Обнаружение события загрузки игры

Программирование

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

Но так как всё это делать сложно, и, наверное, не целесообразно (а мог бы игры делать), а код, который я написал в рамках этой работы, относится к уже стремительно устаревающему Game Maker 8.1, то я позволю себе просто привести его здесь, и задать вопрос невидимому гипотетически существующему любопытному читателю — а что же мы получим в результате его выполнения?

В Create:

x=0
alarm[0]=50
game_save('1')

if file_exists('1')
    show_message('saved')
else
    show_message('NOT saved')

game_load('1')
x=3
show_message('loaded, x='+string(x))

В Alarm 0:

show_message('x='+string(x))

Заспорили мы однажды с Хейзером…

Программирование

… А можно ли сделать игру на декларативном языке программирования?

В университете это было примерно так

Единственным декларативным языком программирования, на котором я программировал некоторое время, был Пролог (об уникальности коего можно читануть на Хабре, и на нём же ещё подробней). Что до Хейзера, то не знаю — пусть он сам нам поведает, какие языки ему были известны. Только не «просто известны», потому что слова «Хаскель» и «Лисп» я тоже знаю. А известны на практике, и опять же не примерно, а в реальной задаче, желательно всё-таки где-то возле программирования компьютерных игр.

Сошлись мы тогда на том, что если я создам 3Д-шутер на декларативном ЯП, то Хейзер будет должен мне купить лицензию на Гамак. Думаете, я остался доволен этим уговором? Нихрена подобного.


Читать дальше...

Прогресс разработки Базы игр

Программирование

Текущий прогресс: 20%

dev.kolenka.su

 Пост обсуждения идеи

История изменений:

01.07 Создан сервер разработки

Создан каркас плагина

Отображение раздела в верхнем меню

06.07 Создание БД

Прототип главной страницы

09.08 Создание админ-страницы для заполнения жанров, платформ, тэгов

16.08 Фиксы страницы в админке

Немного работы над основной страницей базы

Верстка основной инфы об игре на странице добавления

06.09 Закончена верстка страницы добавления игры

21.09 Фиксы верстки страницы добавления, добавлены теги и платформы

22.09 Реализация сохранения игры в бд



Читать дальше...

Конкурс «Наша игра — 2000» (ретроспектива)

Программирование

Оказывается, был такой. Конкурс игр от русских и СНГшных разработчиков. Открыл для себя его существование внезапно, полазив по просторам сайта old-games.ru, а именно — на странице об этой игре:

Особенно я проиграл с вот этого:

Конечно, игру можно корить за отсутствие второго игрока, малую разновидность блоков, один-единственный уровень и за многое другое. Но всё же не стоит забывать, что представленная здесь версия Tanks! — всего лишь тестовый вариант, отправленный на конкурс. В readme-файле автор пишет, что в финальном продукте будут несколько уровней и более богатое разнообразие звуков. Неизвестно, какова судьба у этой самой законченной игры, но посмотреть на недоработанную версию тоже стоит. Не каждый же разработчик оставит на совести игрока столько функций...

Ничего не напоминает?!

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


Читать дальше...