Ответы пользователя по тегу Разработка игр
  • Используются ли контекстные меню в играх?

    @Mercury13
    Программист на «си с крестами» и не только
    По правой кнопке не помню, хотя вроде бывают.
    При щелчке показываются иконки вокруг, например, в Incredible Machine. Или во многих квестах. Или в Fallout 1/2.

    Что контекстному меню мешает.

    1. Плохая раскрываемость (discoverability, возможность найти всё это тыком и интуицией). Игры всё-таки должны собирать большую публику необученных пользователей, верно? Я когда-то учил одну даму ходить по Witness (у неё FPS-управление, но никакой реакции не нужно) — так и не смог. Сам прошёл с большим удовольствием, хотя посторонних головоломок нашёл от силы половину.

    Опытный пользователь рабочих программ просто привык — и то, например, в редакторе Unreal Tournament есть одно очень подлое контекстное меню, которое хрен раскроешь (на заголовке каждого из четырёх видов: спереди, сверху, слева, в перспективе).

    В том же Fallout 1/2 есть команда «оттолкнуть» — неписи ходят по своим делам, и если он загородил нужный проход и никуды, приходится на него действовать этой командой. Понятна только через инструкцию.

    2. Нежелание превращать игру в рабочую программу. Чем дальше интерфейс игры от программы, тем лучше иллюзия. Некоторые авторы — сейчас, правда, это сложно, с управлением из шести осей и десяти кнопок — вообще не делают интерфейса. Хоть «↑ = зайти» да и делают даже в играх вроде Braid и Fez.

    3. Если объект подвижный, бывают глюки, когда ты щёлкнул на него, а он ушёл или даже погиб. Если статус-панель опустела, пока мы нажимаем, мы жмём в никуда. Если меню исчезло — жмём куда-то на игровом поле. Подобное больше годится для чего-то неподвижного и прочного.

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

    5. Опять-таки раскрываемость — если есть команда, скажем, «патрулировать», не очень понятно, что кнопка P действует, даже если контекстное меню не раскрывать.

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

    7. А если ещё важно заранее раскрыть и момент улучить — меню мешать будет.

    В общем, контекстное меню может пригодиться, но, во-первых, в интерфейсе, а не на игровом поле. Ну или в медленной игре, где игровое поле мало чем отличается от интерфейса. А во-вторых, оно по определению дублирует команды, а если в игре их немного (иначе хрен этой игре обучишься), ничего не стоит вывалить их все другим методом. А те игры, которые делают доступ ТОЛЬКО через контекстное меню — ну, учитесь у Fallout 1/2 и Incredible Machine.

    UPD. Вспомнил. В Mafia и некоторых частях Hitman, если действий вокруг много, по кнопке «Действие» выводит меню: что выбираешь?
    Ответ написан
    Комментировать
  • Как архитектурно правильно организовать классы в игре на JS. (ООП)?

    @Mercury13
    Программист на «си с крестами» и не только
    Статические методы класса как раз для оперирования с несколькими экземплярами класса?

    Статические поля и методы служат для работы с классом в целом. Примеры:
    • Есть десять объектов и новых создавать нельзя.
    • Общий для всей проги объектный пул, а второго, скорее всего, не будет.
    • Псевдоконструктор — Rect.xyxy(x1,y1,x2,y2) и Rect.xywh(x,y,w,h).
    • Функциональность никак не зависит от экземпляра объекта: calculateDamageWithCrit при условии, что генератор случайных чисел тоже статический (принадлежит библиотеке языка в целом, а не игровому миру).

    Где правильно хранить экземпляры классов врагов?

    С Wave вы, вероятно, сами запутались: это то информация о волне, то часть текущего состояния мира. Я бы всех врагов закинул в Game (правда, назвал бы объект World).

    Создать статическую переменную в классе башни, или все же создать экземпляр башни и хранить его в классе игры

    Башня принадлежит игровому миру — тоже её в Game (или World).

    У башни есть массив с пулями которые она выпускает.

    Пули очень не стоит в башню — их лучше в тот же Game/World. Башню вы уничтожаете — пули тоже исчезают?

    И эта вот функция просчёта у меня просто в файле. Нужно ли её загонять в класс как метод?

    Только для красоты. Не важно, где лежит скрытая функция, если она не зависит от экземпляра (типа-статическая) и скрытая (не видна снаружи).

    Важная штука: часто в играх есть неизменная информация о врагах, башнях, пулях (TowerType, EnemyType, BulletType, WaveInfo…), и есть конкретный экземпляр (Tower, Enemy, Bullet). Иногда враги, башни и пули объединяют в один GameObj, но это уже зависит от архитектуры. Возможно и так, и этак.
    Ответ написан
    6 комментариев
  • Что это за файл и синтаксис?

    @Mercury13
    Программист на «си с крестами» и не только
    Это файл местной консоли. Файл устроен на манер командного: каждая строчка — это отдельная команда для игрового интерпретатора.

    Первая часть — это общая конфигурация игры, которую, скорее всего, больше менять нельзя. Очень удобно при разработке: я сейчас на W10, разрабатывая программу, воссоздаю её каталог символьными ссылками, но тогда символьных ссылок не было, даже под NT. Приходилось брать файлы откуда-то из другого места, а не из каталога с EXE.

    Вторая — самые настоящие команды консоли. Quake очень популяризовал внутреннюю консоль игры.
    Ответ написан
  • Как создают текстуры для игр?

    @Mercury13
    Программист на «си с крестами» и не только
    Вы, конечно, говорите о 3D. Там создают текстуры для ожидаемого разрешения экрана (2к или 4к, например), а остальное — MIP-текстурирование. Уменьшенные в 2, 4, 8 и т.д. раз версии создаются автоматически.
    Отдельный вопрос — как в текстуру втиснуть псевдо-векторную вещь, для этого используется хитрый формат текстуры и хитрые шейдеры.

    Вы можете запустить и какой-нибудь Need for Speed Porsche в 4к. Скорее всего, в каком-то месте уровня зависнет, но некоторое время работать будет. Края объектов будут резкие, за это отвечает 3D-движок. Но треугольники будет видны, а текстуры мыльные по современным меркам. Вот вам огромное превышение системных требований.

    Но в текстурах есть одно важное попущение меньшим разрешениям: между островками текстур должно быть несколько пикселей, чтобы при уменьшении не захватило соседний островок, и островки должны быть зарисованы с припуском по той же причине.
    Ответ написан
  • Возможно ли реализовать одноранговый мультиплеер с защитой от жульничества?

    @Mercury13
    Программист на «си с крестами» и не только
    Это не одноранговая игра, это клиент-серверная.

    ИДЕЯ 1. Передавать с сервера картинку. Всё, читерство пресечено на корню. Это те самые Google Stadia и PS Now. Недостатки — в огромной нагрузке на сервер и задержках между управлением и картинкой. Как их решить?

    ИДЕЯ 2. Передавать с сервера некую информацию, по которой клиент будет строить картинку. Нагрузка на сервер меньше — он не занимается рендерингом. Зато появляется первая предпосылка к жульничеству — по этой информации жульническая программа определяет, где находится враг, и наводит оружие. Но остаётся недостаток: всё та же огромная задержка между управлением и картинкой. При этом задержку никак нельзя улучшить — у нас то самое «пространство-время», знакомое из теории относительности.

    О чём я: между Землёй и Луной секунда, и случились два события, на Земле и на Луне. Возможны три варианта: а) свет доходит от Земли до Луны, и событие на Земле заведомо раньше для любого наблюдателя; б) свет доходит от Луны до земли, и событие на Луне заведомо раньше; в) не успевает дойти ни тот, ни другой свет, и хрен его знает, какое раньше — для одних наблюдателей земное, для других лунное. Подобное пространство-время есть и в любом динамичном мультиплеере.

    ИДЕЯ 3. Ну, если задержку не улучшить, купируем её тем, что клиент может как-то предсказывать, чтó остальные будут делать, пока пакет ползёт от сервера. Чего не хватает? 1) Клиенты могут внезапно появляться в поле зрения, и не очень хотелось бы, чтобы мы зашкерились за углом, а враг появился ХЗ где, причём где — это зависит от нашего пинга; 2) Из соображений серверной производительности вопрос «видит ли клиент А клиента Б?» желательно решать очень приблизительно, с запасом — Z-буфер решит эту задачу значительно лучше, чем вычисление на процессоре, видит ли клиент А мизинец клиента Б.

    Есть ещё такая штука: представьте себе, у клиента А пропала связь. Он со своей пропавшей связью начинает крутить мышью, и не хотелось бы, чтобы в момент появления связи этот клиент умер от ХЗ кого, кого он даже не видел. Ну или со связью в порядке, но А очень насобачился работать мышью. Так что вопрос «видит ли один другого» обычно не рассматривает направление взгляда, только геометрию уровня.

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

    Вот, собственно, и причина wallhack’ов: сервер принял решение, что клиент А, возможно, видит клиента Б, и начинает передавать его положение. И потому wallhack’и обычно не работают, если Б далеко: сервер понимает, что Б не виден и в ближайшее время не будет виден.

    Есть ещё такая помощь клиенту, связанная с тем, что есть мощные виды оружия вроде снайперской винтовки, с огромной разницей между «попал» и «промазал». Каждый клиент видит своё в зависимости от работы сети (вспомните фразу «ХЗ, что раньше»), и в момент прихода информации о выстреле сервер пытается восстановить, что именно видел клиент на своём экране, и по этой картинке решает, попал или нет (на этом основан глюк «спрятался за углом, и всё равно убили»). Но эту помощь тоже эксплуатируют: представьте себе, пакеты клиент→сервер, которые идут по штуке за, скажем, 50 мс, отправляют по пачке за 0,3 секунды — больше типичного времени компенсации задержек, но меньше типичного времени реакции. Получается, что персонаж скачет (клиенты, заглядывающие наперёд на 100 мс, отказываются предсказывать дальше — пусть он лучше зависает, чем тыкается в стены), причём скачет так, что в него хрен выстрелишь (пока среагируешь, он перескочит в другое место). А поскольку пакеты сервер→клиент ходят исправно, а сервер руководствуется прикидкой, что видел клиент, клиент всё видит и метко стреляет, а в него никто попасть не может. Если этот трюк исполнять автоматически только при появлении врага на экране, это будет максимально беспалевно — ну у игрока начались перекэширования из-за того, что видеопамяти не хватило. Эту штуку можно сделать даже на приставке, даже не разбирая её — нужен свитч (приставки всё-таки насобачились сообщать, что кто-то физически режет провод), кусок витой пары, моторчик с оптопарой и педалька под ногу. А для некоторых игр хватает свитча и педали, главное не жадничать и отпускать её иногда.

    А теперь вместо «чечни» (я так обозвал Counter-Strike — он появился в те времена, когда война в Чечне превратилась в антитеррористическую операцию) возьмём какой-нибудь преферанс. В чём разница? А в том, что игра не динамичная! И потому тактика «передавать только те данные, что нужны для рендеринга» вдруг становится годной. И если вы в преферансе сможете палить чужие карты — автор разгильдяй!

    Скажу честно, я не знаю, как на всех этих chess.com компенсируют задержки в шахматном суперблице типа «три минуты на партию». Если средняя игра тридцать-сорок ходов, то задержки в 0,1 секунды отъедят 3…4 секунды, а задержки в 0,2 — 6…8. Но из-за шахматного жульничества и далеко ушедшей дебютной теории основной формат игры — именно суперблиц.

    В общем, хрен вы реализуете диплом о защите от жульничества, не понимая, как работает мультиплеер и откуда жульничество берётся. А берётся жульничество из трёх предпосылок: 1) участники мультиплеера живут в релятивистском пространстве-времени; 2) очень хочется экономить вычисления на сервере; 3) жульничество иногда маскируют под обычные для компьютерного мира явления вроде сетевого затора или долгого кадра.

    Да, как реально защищают от жульничества: 1) Не допускают никого постороннего в программу-клиент, чтобы даже пакеты нельзя было расшифровать; 2) Ловят программы-жулики по принципу антивируса; 3) Передают клиентам как можно меньше того, что они знать не обязаны; 4) Ловят признаки компьютерного вмешательства в изображение или управление.
    Ответ написан
    Комментировать
  • Как ограничить скорость разгона?

    @Mercury13
    Программист на «си с крестами» и не только
    Итак, тут у нас задача: каким образом, НАИМЕНЬШЕЙ КРОВЬЮ (игра совершенно условная, верно?) сделать поведение машины в зависимости от оборотов. Опустим сложные материи вроде приёмистости, турбины, торможения двигателем, спойлеров, дифференциала, увода шин и прочего. Считаем, что обороты мотора измеряем в об/мин, остальное (скорости, расстояния…) — в единицах СИ.

    1. Нам нужны передаточные числа коробки в единицах «обороты·c/м·мин». Имея физическую машину в гараже и инструкцию к ней, действуем так: замеряем действующий радиус колеса с учётом смятой шины, находим передаточные числа передач в коробке и главной передачи, и

    об·/метр = (передаточное_число_коробки·передаточное_число_главной_передачи)/(120π·радиус_колеса).

    Ну или просто едем на стабильной скорости, замеряем скорость GPS’ом или километровыми знаками (важно! — спидометр всегда врёт), и заодно видим обороты мотора.

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

    2. Теперь придумываем сопротивление движению в виде квадратного трёхчлена: Fсопр=av²+bv. Цифры a и b находим из двух условий: а) на максимальной скорости Fсопр=Pmax/v; б) линейная часть равна квадратичной где-то около 30 км/ч.

    3. Находим характеристику двигателя: МОЩНОСТЬ от оборотов. Загоняем её в игру в виде ломаной или сплайна.

    4. Прикидываем мощность мотора P в зависимости от положения газа, оборотов и этой кривой.

    5. Ускорение машины: a = (P/v−Fсопр(v))/m, с какой-нибудь аппроксимацией, когда скорость меньше минимальной стабильной (5…10 км/ч в зависимости от машины).

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

    7. Если машина вдруг прыгает (хоть одно ведущее колесо в воздухе) — просто считай, что она на нейтрали.

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

    9. На малых скоростях есть ещё один ограничивающий фактор — пробуксовка шин. Если игра условная, то просто коряво рассчитай трение шин и не допускай такого разгона, что шины буксуют.
    Ответ написан
    Комментировать
  • Как поставляются игры на компьютеры?

    @Mercury13
    Программист на «си с крестами» и не только
    Касательно читов. Я простым анализом памяти смог узнать в Microsoft Train Simulator состав поезда игрока, его скорость, положение контроллеров, пройденный путь, давление в различных элементах пневматического тормоза (оказывается, в PSI), боксует ли он. Жаль, я не смог обнаружить привязку всего этого к путям.

    Как я это делал. Через ArtMoney получал некие базовые адреса. Если адрес статический — ну, всё в порядке. Если нет — писал утилиту, в которую изначально вводился найденный адрес. По цифрам я прикидывал, где мог начинаться объект, и снова поиск через ArtMoney… Ну и так далее, пока не дойду до статического адреса. Вот так оно у меня выглядело.

    TmstsLocalTrain = packed record
          _mem0000 : array [$0000..$0061] of byte;
          // 0062
          HeadWagon : dword;   // Головная единица ПС
          // 0066
          TailWagon : dword;   // Хвостовая единица ПС
          // 006A
          LocWagon : dword;    // Управляемая игроком единица ПС
          // 006E
          _mem006E : dword;
          // 0072
          Caps : dword;
          // 0076
          _mem0076 : array [$0076..$0091] of byte;
          // 0092
          Speed : single;       // Скорость по скоростемеру, м/с
          // 0096
          Acceleration : single;  // Ускорение, м/с2
          // 009A
          _mem009A : array [$009A..$00D5] of byte;
          // 00D6
          TimeSec : single;
          // 00DA
          ReversingOdometer : single;
          // 00DE
        end;


    ПС = подвижной состав. Одометр реверсивный, потому что при осаживании (заднем ходе) считает назад. Байтовый массив _mem0000 — это память, которую я не смог опознать. HeadWagon, TailWagon, LocWagon, Caps — на самом деле указатели, но поскольку они не имеют смысла в адресном пространстве лентописателя (задачей было сделать аналог скоростемерной ленты), они Dword, а не указатели.

    Вспоминал, что значат сокращения П, ПТЭ и прочее. Оказалось: паровоз, тепловоз, электровоз. Естественно, регулятор пара есть только у паровозов.
    Ответ написан
    Комментировать
  • Я придумал новый гениальный способ оптимизации игр?

    @Mercury13
    Программист на «си с крестами» и не только
    Гений постольку, поскольку каким-то раком научил движок делать то, чего он не может из коробки. Но есть вопросы.
    Поскольку игра изометрическая, низшие уровни детализации неактуальны. А в обычном 3D — более чем.
    Изометрия обычно не настолько детальна, чтобы загрузка была нужна особенно часто — нужно что-то вроде «при приближении к подуровню грузить его».
    Если движок не поддерживает фоновую подгрузку — всё будет с ней в порядке, не будет игрок испытывать тормозов?
    С мультиплеером всё в порядке?
    Ответ написан
    Комментировать
  • Какой способ отрисовки использован в игре?

    @Mercury13
    Программист на «си с крестами» и не только
    Рейкастинг и есть, только не по пикселям, а по столбцам.
    Ответ написан
    5 комментариев
  • Как работает просчёт траектории в играх типа Angry Birds?

    @Mercury13
    Программист на «си с крестами» и не только
    От массы тела зависит взаимодействие с другой массой.
    От силы броска и массы тела — начальная скорость v.

    Чаще всего действительно не доводят до аналитического решения, а каждый кадр происходит шаг численного решения дифференциального уравнения:
    (vx, vy)′ = (0, −g) — ну или сопротивление воздуха добавьте
    (x, y)’ = (vx, vy)

    Гуглите «методы Рунге—Кутты», нам хватит метода второго порядка.
    Ответ написан
    Комментировать
  • Каков смысл скалярного произведения в Cel Shading?

    @Mercury13
    Программист на «си с крестами» и не только
    Отвечу по существу.

    У нормали длина всегда 1. Иногда это реально вектор, перпендикулярный к полигону — если мы хотим осветить плоский полигон как плоскость. Иногда мы хотим из плоских полигонов создать впечатление криволинейной поверхности и потому делаем (например, интерполяцией или специальной текстурой, т.н. картой нормалей) непрерывное поле нормалей.

    Вектор луча — это единичный (или той длины, какой хочешь) вектор, идущий от источника света к той точке, с которой работаем. (Ну или наоборот, смотря как формула записана.)

    Если длина вектора луча тоже 1 — то результат будет [−1…1]. Если он меньше 0 (в случае, если нормаль наружная, а луч идёт от источника света) — перед нами коэффициент, во сколько раз реальная освещённость меньше, чем обеспечиваемая источником света. Если больше — поверхность в собственной тени. (Расчёт падающих теней — отдельный и сложный вопрос.)

    С цел-шейдингом никак это не связано, это вообще база по освещению.
    Ответ написан
    Комментировать
  • Можно ли выкладывать на вики сканы карт из настольной игры или хотя бы текст с карт?

    @Mercury13
    Программист на «си с крестами» и не только
    Это находится в «серой зоне» и зависит от «борзости» издателя. По авторским правам это чистое «добросовестное пользование несвободного контента», которое определяется исключительно судом (нет чётких критериев), и если издателю захочется закрыть — закроет. Пара советов.
    1. Ставьте такое качество, чтобы текст едва читался.
    2. Использование каждой несвободной картинки должно быть обосновано.
    Ответ написан
    Комментировать
  • Как договорится с художником и какие есть лицензии у изображений?

    @Mercury13
    Программист на «си с крестами» и не только
    На вопрос 2 — из некоммерческих годятся общественное достояние (Public domain = PD = CC0) и «укажи автора» (Creative Commons Attribution = CC-BY). Никакие другие лицензии CC для коммерческой игры не годятся!

    Если игра открытая — подумай, под какой лицензией она будет выпущена и совместимы ли требования с этой лицензией. Например, с GPL совместимы PD = CC0, CC-BY, CC-BY-SA.

    Разумеется, возможна ситуация, что одни части игры под одной лицензией, другие — под другой. Например, движок GPL-ный, а изображения под более строгой или более мягкой лицензией. Так, Doom (1993) имеет GPL-ный движок и коммерческое всё остальное.

    Каждую полукоммерческую лицензию приходится рассматривать по отдельности.

    Если лицензий несколько (например, CC-BY + GPL2 + GPL3) — если среди них есть хоть одна, которая тебя устраивает, порядок!
    Ответ написан
    Комментировать
  • Какая графика используется в игровых движках?(вектор или растр.)И как вообще устроен графический редактор в них?

    @Mercury13
    Программист на «си с крестами» и не только
    Трёхмерная графика не бывает векторной и растровой. У неё там свои разновидности, и там она используется полигональная. Текстуры, разумеется, растровые. Существуют псевдовекторные элементы вроде поля расстояний, но это именно что «псевдо-».

    Двухмерная — в подавляющем большинстве случаев растровая, но и векторные элементы бывают.
    Ответ написан
    Комментировать
  • Старые игровые движки и их строение?

    @Mercury13
    Программист на «си с крестами» и не только
    Нашёл вот такую книгу.
    gamesmaker.ru/books/kak-samomu-sozdat-trehmernuyu-igru
    Вроде она.
    Ответ написан
    Комментировать
  • Что делать при несовпадении координат на клиенте и сервере?

    @Mercury13
    Программист на «си с крестами» и не только
    Я об играх, где игрок управляет одним объектом: шутерах, гонках…
    Клиент и сервер держат несколько исторических положений.

    Координаты СЕБЯ, ЛЮБИМОГО — клиентские. Если серверные координаты в такт 1234 не совпадают с нашими — откатываемся к серверным, повторно прокрутив нужное количество тактов управления.
    Вещи неуправляемые/слабоуправляемые, вроде запаса жизни, берутся подтверждённые сервером.

    Координаты ВРАГОВ — серверные (возможно, каким-то образом экстраполированные).

    Для физики пуль пишется т.н. «компенсация пинга»: если клиент пишет, что в такт 1234 он стреляет, сервер восстанавливает, что КЛИЕНТ ВИДЕЛ в такт 1234, и сравнивает попадание именно с ТЕМ положением клиента. Для медленных снарядов компенсация обычно не пишется.
    Ответ написан
    Комментировать
  • Как программировать игру в игре?

    @Mercury13
    Программист на «си с крестами» и не только
    Обычно для этого используют скриптовый движок. Наиболее известный — Lua.

    Также используют триггеры, эталонный пример — StarCraft.
    Но, работая с триггерами, надо разделять «условие» и «повод». Повод — это событие-импульс, которое МОЖЕТ спровоцировать срабатывание триггера. Условия — это уже дополнительные вещи, которые проверяются потом.

    Третья возможность — движок, основанный на данных. Например, задаём тип атаки, количество HP, тип движения и прочее, и вся эта библиотека уже записана в коде. Эталонный пример — Doom (самый ещё первый, 1993 года). Кстати, в его последователе Hexen появились скрипты.
    Ответ написан
  • Как создать отличный сбалансированный уровень?

    @Mercury13
    Программист на «си с крестами» и не только
    https://www.youtube.com/watch?v=0xBJwrm9C8w
    https://www.gdcvault.com/play/1023139/Level-Design...

    https://www.rockpapershotgun.com/2015/01/22/how-to...

    https://www.gamasutra.com/blogs/AsherEinhorn/20150...

    Есть ещё книга «Fundamentals of puzzle and casual game design», но я её пока не видел в лицо.

    И без бета-тестеров никуда. Сам не делал уровни, но один знакомый нарисовал немаленький мод к Braid — бета-тестерами служили его отец и я.

    Вот ещё нашёл по Braid: gamedesignreviews.com/reviews/braid-understanding-...
    Ответ написан
    Комментировать
  • Как продумать геймплей, чтобы он был завлекающий и сбалансированный?

    @Mercury13
    Программист на «си с крестами» и не только
    К сожалению, геймдизайн — это очень творческая профессия, и Extra Credits предупреждает: дизайн, базирующийся на собранных данных, не делает нового, он только оттачивает имеющееся.
    https://www.youtube.com/watch?v=nqGcXOksFGg

    Может быть, это вам и нужно — заработать побольше денег на клоне Dota (PUBG, Candy Crush, Angry Birds). Но про творчество попытаюсь рассказать.

    1. Ходите на художественные выставки.
    2. Играйте во что угодно, впрочем, необычным образом. Во-первых, играйте не только в любимые жанры, но и в файтинги, RPG, симуляторы и прочее. Во-вторых, часто хватит потратить на игру четыре-пять часов. В-третьих, прикарманивайте их решения. В четвёртых, ищите поломы системные (например, где-то ∞ денег) и поломы отдельной подсистемы (застревающая камера). Намеренные ли эти поломы? Мешают ли играть?
    Ответ написан
    Комментировать
  • HTML5 game | Как убрать задержку клавиатуры после первого нажатия клавиши?

    @Mercury13
    Программист на «си с крестами» и не только
    Если игрок управляет дискретным курсором или маркером, например, в сапёре или пасьянсе (если те играются с клавиатуры, разумеется) — так и надо, нужен системный автоповтор клавиш.

    Если игрок управляет непрерывно движущимся персонажем, надо отойти от системных автоповторов и сделать две независимых подсистемы.
    • Подсистема реагирования на клавиатуру. При нажатии на кнопку системный код превращается в виртуальную клавишу (например, «Идти вверх», «Выстрел» или «Бомба»). Затем в битовой маске управления в соответствующей позиции ставится 1. При отпускании — соответственно 0.
    • Подсистема тактов игры. По таймеру проводится такт игры — акт управления всеми её персонажами, главным и врагами. В зависимости от состояния клавиш мы ведём Главного в ту или иную сторону.
    • Третья подсистема — рендерер игры. Она может быть синхронной с тактами игры или нет, в зависимости от того, какое мы хотим поведение на слабых машинах и есть ли желание проработать асинхронщину (не обязательно многопоточную; например, рендерер может поминутно вызывать «прокрути такт игры, если надо»). А также звук и сеть — в нашем вопросе, впрочем, не до них (и вообще рендерингом занимается браузер).

    Если тактовая частота игры невелика (скажем, до 16) и приходится подгонять героя «на один шажок», у меня есть маленький лайфхак, оставшийся с J2ME. Создаём две маски: «нажатая» и «удерживаемая».
    • При нажатии: поставить 1 в обе маски.
    • При отпускании: поставить 0 только в удерживаемую.
    • При управлении героем: нажатая := нажатая OR удерживаемая; именно по этой «нажатой» управляем героем; нажатая := 0.

    С новым годом, и хороших игр!
    Ответ написан
    1 комментарий