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

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

Лаги в играх, и почему фреймскип — скорее глупое решение, чем нет

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

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

Фреймскип - пропуск кадров, но в онлайн-играх, раз уж кадры пропускаются, как-то надо идти дальше? Эту разницу пытаются скомпенсировать предсказаниями, а потом — просто приёмом информации об игровом состоянии от сервера (ведущего).

Тут я хотел рассказать про дельта-тайминг. Но создал я этот пост  3 июля 2016, 21:32, а сейчас 25 июля 2017, 3:07, и знаете что? Я просто скажу важную (для меня) мысль, и не буду делать из этого сколь-либо длинный пост.

Кадры пропускать не нужно, потому что это отнимает управление (игровое время и, по сути, игровую волю) у игрока, который пропускает кадры. Лучше уж игра будет медленной у всех, чем нечестной у кого-либо. Авторское ИМХО.

 

https://www.youtube.com/watch?v=BbaN8BN_dkM - а вот с этого я офигел, люди додумались использовать Lag Switch чтобы, управляя лагами, побеждать в игре, использующей уязвимую к этому модель синхронизации игрового состояния!

И ещё тут есть подборка картинок на тему:

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

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

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

В 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 Реализация сохранения игры в бд



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