Вообще, портирование игр - довольно распространённая практика. Хочется верить, что удаётся сохранить основную кодовую базу практически неизменной, однако надеяться на это не приходится.
Вот, например, Contra, хорошо знакомая нам по NES, портированная на Commodore64.
Хотя изображения явно отличаются (тут всё уже зависит от производительности обеих систем), но, в целом, подходы довольно похожи.
Однако ни одна игра ничего не стоит без грамотного управления. А вот тут начинается самое интересное: как портировать игру и не повредить управление?
Есть более и менее отзывчивые контроллеры (скажем, обычный геймпад и клавиатура, на которой выставлена искусственная задержка нажатия кнопок во избежание эффекта залипания). И если это можно как-то решить замедлив темп игры или отказавшись от наиболее нервных участков, то как быть с управлением, которое требует большее количество кнопок, чем есть сейчас.
В качестве примера можно привести портированный на NES Mortal Combat. Напомню, что у Sega - 6-кнопочный геймпад (на тот момент трёхкнопочные либо отошли, либо отходили), а на NES - только 2 игровые кнопки (турбо кнопки не считаются).
Выход был только один - убрать часть приёмов, часть упростить (по нажатию комбинаций), а часть сделать настолько сложными, что набрать их было бы практически невозможно.
Но это всё прелюдия. Теперь ближе к делу. А именно - что делать при разработке игры, когда имеешь дело с управлением?
Как-то ранее я уже писал про то, что контроллер - это нечто большее, чем "железка"; это ещё и программный функционал, содержащий в себе все возможности игрового персонажа, его состояния и прочее.
Например я, исхожу из предположения, что современные системы разработки позволяют относительно легко портировать код (впрочем, порт киберпанка на PS4 показал, что всё не совсем так просто). Однако, портирование - это далеко не всегда просто перекинуть кодовую базу с одной платформы на другу, собрав исходники другим компилятором. Это ещё и приспособиться к новым условиям выполнения приложения. И тут, как раз способ игры ставится во главу угла.
И главный вопрос звучит так: как сделать так, чтобы при смене способа играть, игровой процесс сохранил бы привлекательность? Вдобавок хорошо бы ещё, чтобы для этого не пришлось переписывать половину проекта.
На все аспекты этого вопроса ответить непросто, однако на тему управления - можно попробовать.
Выход: "наборные контроллеры". Проще говоря - программный интерфейс, стоящий перед контроллером физическим и контроллером игровым.
Такой контроллер делает следующее:
- Создаётся на основании тех кнопок (способов управления), которые доступны (2 или 6 кнопок игры, чувствительный стик или крестовина управления);
- Умеет получать и интерпретировать команды со стороны физического интерфейса (это, однозначно, придётся писать под каждую платформу отдельно);
- Интерпретированную команду сообщать контроллеру через прослойку доступным для него методом.
Иными словами, каждая абстракция на пути к решению это ещё один способ как сделать так, чтобы можно было оторвать кусочек программы, заменить его на другой и всё бы заработало. Идеальная абстракция для портирования (да и не только), это когда всё приложение собрано из некоторого количество автономных, эффективно взаимодействующих блоков, один или несколько из которых можно заменить, получив новый способ работы с программой, но сохранив при этом ключевую функциональность.
Если возвращаться к примеру с Контрой, то:
- Была переделана система управления (на Commodore64 играть, как по мне, тяжелее), но, при этом, сохранён алгоритм управления игроком в целом;
- Мозаика игрового фона отличается, но, в целом, сохраняются схожие плиточные лекала (немного отличаются по размерам из-за особенности система, сохраняя принцип);
- Игровой процесс полностью сохранён;
- Некоторые уровни частично или полностью отличаются по причине особенностей систем, однако это не влияет на повествование (да, оно там, несмотря ни на что, присутствует).