Как сделать игру split screen
Режим «Разделенного экрана» или Split Screen своими руками
Многие из нас проводили вечера перед теплым ламповым телевизором с друзьями, играя на приставках. Всегда особенно приятно было играть одновременно вдвоем, не ожидая своей очереди.
Ностальгия.
К сожалению, в настоящее время многие разработчики игр не добавляют подобного режима — новые игры со splitscreen можно пересчитать чуть ли не на пальцах одной руки. В один весенний вечер пришла идея в голову попробовать обойти ограничение, накладываемое разработчиками, и сделать игровой режим с разделением экрана более доступным.
В качестве подопытного кролика игры мною была выбрана «World of Tanks» по нескольким причинам:
1. Возможность играть вдвоем, данный режим называется «Взвод».
2. Игра на минимальных настройках достаточна не требовательна — любой средний по производительности ПК должен тянуть 2 копии.
3. Геймплей танков достаточно незатейлив, хотя разработчиками и позиционируется как «массовая многопользовательская онлайн-игра в жанре action с элементами ролевой игры, шутера и стратегии» (Wikipedia). Но как по мне — аркада для пыщь-пыщь.
4. Наверное, самая основная причина — я, по несколько часов в неделю, и мой младший сын любим пострелять. Со старшим мы иногда бегаем в Portal2, там режим разделенного экрана для ТВ есть.
Эти ребята надеюсь многим знакомы 😉
Более детальное изучение всех составляющих для танков вдвоем на ТВ привело к следующему:
1. Настроить клиент игры для возможного запуска двух копий
2. Необходимо разделить экран телевизора на два виртуальных.
3. Решить проблему отправки нажатий кнопок/отклонения стиков с геймпада в неактивное окно.
4. Отправить вибрацию в разные геймпады с разных клиентов.
Подробнее о процессе решения.
1. Запуск 2-х клиентов.
По-умолчанию, разработчики из Wargaming убрали возможность одновременного запуска двух копий. Не буду описывать все прелести «песочницы» — Sandboxie Вам в помощь.
2. Разделение экрана телевизора на две части.
«WoT» в оконном режиме может иметь минимальное разрешение 1024х768, в случае разделения FullHD телевизора пополам, необходимо разрешение каждого окна минимум 960х1080, а учитывая рамки окна и заголовок и того меньше. Т.е. стандартными «горячими клавишами» через Snap разнеся окна в разные стороны мы получаем частичное перекрытие окон. Любые другие утилиты для разделения рабочего стола на две части используют похожий функционал и никаким образом не могут повлиять на минимальное разрешения игры по ширине.
Перепробовав огромное количество, натолкнулся на Virtual Display Manager, подкупило отсутствие в названии слова desktop.
Утилита сделала нужное — добавив конфигурацию двух виртуальных дисплеев и перемещая окно в нужный — игра принимает нужное нам значение, а именно занимает ровно половину экрана. Кстати надо проверить разделение на большее количество.
3. Отправка нажатий клавиш в неактивное окно.
Это решение было для моего ума самым сложным. Два клиента запущены, окна разнесены в стороны и не перекрывают друг-дружку, но одно из окон активно, соответственно принимает нажатия кнопок и перемещения мышки, а вот второе не активно со всеми вытекающими.
Разрешение 1366х768.
К решению этой проблемы меня подтолкнуло знакомство с AutoHotkey. Вот уж поистине «AutoHotkey — это свободная утилита под Windows с открытыми исходными кодами и скриптовый язык с огромными возможностями, в принципе даже не требующий установки.» (ссылка)
Причины, почему скрипт срабатывал, мне так и остались неизвестны.
После многих безуспешных попыток, решение нашлось. Через SendMessage сообщать окну, что оно активно и отправлять нажатия клавиш. Такой своеобразный обман.
Дальше пошло веселее.
Прошу конструктивно критиковать код совершенству нет предела.
JoyMultiplier = 5
JoyThreshold = 5
JoyThresholdUpper := 50 + JoyThreshold
JoyThresholdLower := 50 — JoyThreshold
#Persistent
SetTimer, WatchAxisFirstJoyMoveForwardAndZoom, 10
SetTimer, WatchAxisFirstJoyMoveRotate, 10
SetTimer, WatchAxisFirstJoyCameraRotateVert, 10
SetTimer, WatchAxisFirstJoyCameraRotateHoriz, 10
SetTimer, WatchAxisFirstJoyShoot, 10
SetTimer, WatchFirstJoyPOV, 10
SetTimer, WatchAxisSecondJoyMoveForwardAndZoom, 10
SetTimer, WatchAxisSecondJoyMoveRotate, 10
SetTimer, WatchAxisSecondJoyCameraRotate, 10
SetTimer, WatchAxisSecondJoyShoot, 10
SetTimer, WatchSecondJoyPOV, 10
return
;;;;;;;;;;;; убираем загловок окон
;;;;;;;;;;;; первый геймпад движение вперед/назад в неактивном окне и зум
WatchAxisFirstJoyMoveForwardAndZoom:
GetKeyState, 1JoyY, 1JoyY
GetKeyState, 1JoyZ, 1JoyZ
GetKeyState, 1Joy2, 1Joy2
GetKeyState, 1Joy3, 1Joy3
FirstJoyMoveForwardAndZoomPrev = %FirstJoyMoveForwardAndZoom%
if 1Joy2 = D
GoSub, FirstJoyConsumables
else if 1Joy3 = D
GoSub, FirstJoyConsumables
else
<
if 1JoyZ > 70
<
if 1JoyY 70
FirstJoyMoveForwardAndZoom = PgUp
else
FirstJoyMoveForwardAndZoom =
>
else if 1JoyY 70
FirstJoyMoveForwardAndZoom = vk53
else
FirstJoyMoveForwardAndZoom =
>
if FirstJoyMoveForwardAndZoom = %FirstJoyMoveForwardAndZoomPrev%
return
;;;;;;;;;;;; первый геймпад движение влево/вправо в неактивном окне
WatchAxisFirstJoyMoveRotate:
GetKeyState, 1JoyX, 1JoyX
GetKeyState, 1Joy2, 1Joy2
GetKeyState, 1Joy3, 1Joy3
FirstJoyMoveRotatePrev = %FirstJoyMoveRotate%
if 1Joy2 = D
GoSub, SecondJoyConsumables
else if 1Joy3 = D
GoSub, SecondJoyConsumables
else
<
if 1JoyX > 80
FirstJoyMoveRotate = vk44
else if 1JoyX 80
FirstJoyConsumables = vk36
else FirstJoyConsumables =
>
else if 1JoyX between 40 and 60
<
if 1JoyY 90
FirstJoyConsumables = vk35
else FirstJoyConsumables =
>
else if 1JoyX > 80
<
if 1JoyY 80
FirstJoyConsumables = vk34
else FirstJoyConsumables =
>
else FirstJoyConsumables =
if FirstJoyConsumables = %SFirstJoyConsumablesPrev%
return
;;;;;;;;;;;; первый геймпад обзор влево/вправо в неактивном окне
WatchAxisFirstJoyCameraRotateVert:
GetKeyState, 1JoyU, 1JoyU
GetKeyState, 1Joy5, 1Joy5
FirstJoyCameraRotateVertPrev = %FirstJoyCameraRotateVert%
if 1Joy5 = D
GoSub, FirstJoyCommandMenu
else
<
if 1JoyU > 70
FirstJoyCameraRotateVert = Right
else if 1JoyU 70
FirstJoyCameraRotateHoriz = Down
else if 1JoyR 80
FirstJoyCommandMenu = Numpad6
else FirstJoyCommandMenu =
>
else if 1JoyU between 40 and 60
<
if 1JoyR 90
FirstJoyCommandMenu = Numpad5
else FirstJoyCommandMenu =
>
else if 1JoyU > 80
<
if 1JoyR 80
FirstJoyCommandMenu = Numpad4
else FirstJoyCommandMenu =
>
else FirstJoyCommandMenu =
if FirstJoyCommandMenu = %FirstJoyCommandMenuPrev%
return
;;;;;;;;;;;; первый геймпад выстрел в неактивном окне
WatchAxisFirstJoyShoot:
GetKeyState, 1JoyZ, 1JoyZ
FirstJoyShootPrev = %FirstJoyShoot%
if 1JoyZ 70
<
if 2JoyY 70
SecondJoyMoveForwardAndZoom = PgUp
else
SecondJoyMoveForwardAndZoom =
>
else if 2JoyY 70
SecondJoyMoveForwardAndZoom = vk53
else
SecondJoyMoveForwardAndZoom =
>
if SecondJoyMoveForwardAndZoom = %SecondJoyMoveForwardAndZoomPrev%
return
;;;;;;;;;;;; второй геймпад движение влево/вправо в активном окне
WatchAxisSecondJoyMoveRotate:
GetKeyState, 2JoyX, 2JoyX
GetKeyState, 2Joy2, 2Joy2
GetKeyState, 2Joy3, 2Joy3
SecondJoyMoveRotatePrev = %SecondJoyMoveRotate%
if 2Joy2 = D
GoSub, SecondJoyConsumables
else if 2Joy3 = D
GoSub, SecondJoyConsumables
else
<
if 2JoyX > 80
SecondJoyMoveRotate = vk44
else if 2JoyX 80
SecondJoyConsumables = vk36
else SecondJoyConsumables =
>
else if 2JoyX between 40 and 60
<
if 2JoyY 90
SecondJoyConsumables = vk35
else SecondJoyConsumables =
>
else if 2JoyX > 80
<
if 2JoyY 80
SecondJoyConsumables = vk34
else SecondJoyConsumables =
>
else SecondJoyConsumables =
if SecondJoyConsumables = %SecondJoyConsumablesPrev%
return
;;;;;;;;;;;; второй геймпад обзор и мышь в активном окне
WatchAxisSecondJoyCameraRotate:
MouseNeedsToBeMoved := false
SetFormat, float, 03
GetKeyState, 2JoyU, 2JoyU
GetKeyState, 2JoyR, 2JoyR
GetKeyState, 2Joy5, 2Joy5
if 2Joy5 = D
GoSub, SecondJoyCommandMenu
else if 2Joy5 = U
<
if 2JoyU > %JoyThresholdUpper%
<
MouseNeedsToBeMoved := true
DeltaU := 2JoyU — JoyThresholdUpper
>
else if 2JoyU %JoyThresholdUpper%
<
MouseNeedsToBeMoved := true
DeltaR := 2JoyR — JoyThresholdUpper
>
else if 2JoyR 80
SecondJoyCommandMenu = Numpad6
else SecondJoyCommandMenu =
>
else if 2JoyU between 40 and 60
<
if 2JoyR 90
SecondJoyCommandMenu = Numpad5
else SecondJoyCommandMenu =
>
else if 2JoyU > 80
<
if 2JoyR 80
SecondJoyCommandMenu = Numpad4
else SecondJoyCommandMenu =
>
else SecondJoyCommandMenu =
if SecondJoyCommandMenu = %SecondJoyCommandMenuPrev%
return
;;;;;;;;;;;; второй геймпад выстрел в активном окне
WatchAxisSecondJoyShoot:
GetKeyState, 2JoyZ, 2JoyZ
SecondJoyShootPrev = %SecondJoyShoot%
if 2JoyZ Настройки управления Xbox 360
В общем, у меня получилось как-то так.
Видео геймплея в режиме разделенного экрана:
Видео записывалось с черновым скриптом — когда было только управление танком, башней, снайперский режим и выстрел пробелом.
4. Настройка вибраций для геймпадов.
Здесь я уже отписывал о добавлении вибраций в игру на геймпаде. Так как данная модификация игры использует веб-сервис для отправки вибраций, то для отправки во второй геймпад, нужно было просто изменить порт Flask.
Но, для игры в «Разделенном экране» на вибрирующих геймпадах нужно запускать в «песочнице» полную копию клиента (скопировать папку рядом с другим именем) со своим отдельным модом, также скопировать в «песочницу» Python27.
Думается, что данное решение можно попробовать применить ко многим играм. Решение получилось очень неудобным — много всяких «но». Но могу сказать что игра для «фана» удалась. Удачи всем в боях!
Хочу выразить благодарность Серому форуму и отдельно модератору teadrinker, Korean Random и отдельно inj3ct0r. Спасибо. А так же всем тем кто советовал, помогал и поддерживал меня.
Активация Split Screen
Так как режим Split Screen доступен для Xbox, то можно попробовать активировать его и на ПК
Step 1: First off you need to open up your UTInput.ini file, this will be located in a different place depending on your operating system;
Step 2: Now that you have found the file open it, you will see loads of text, but to save you time just copy all of the text found in the box below, and paste it over your UTInput.ini; (Basically you are removing what’s already there, and replacing it with this.)
Step 3: Now all of the buttons are set up, and will work just like the image shows at the top of this page. But there is still one more thing before you can play split screen.
You need to open up UTGame.ini (It’s in the same folder as the input file)
Once it’s opened look for the line that says;
StringData=(Tag=»Splitscreen»,DefaultValueIndex=0)
Now all you need to do is change the ‘0’ to a ‘1’
Step 4: Now you can run the game, start an instant action game and when it starts the other player will be there. Have fun.
Useful ingame commands: (type these into the console)
Code Effect
debugcreateplayer 0 Creates player 0
debugcreateplayer 1 Creates player 1
debugcreateplayer 2 Creates player 2
debugcreateplayer 3 Creates player 3
debugremoveplayer 0 Removes player 0
debugremoveplayer 1 Removes player 1
debugremoveplayer 2 Removes player 2
debugremoveplayer 3 Removes player 3
setsplit 1 Horizontal split screen
setsplit 2 Vertical split screen
ssswapcontrollers Controls a different screen with player 0s buttons
admin » 09 дек 2010, 19:07
Перевод от DancingLenin:
Шаг 1: Для начала откройте файл UTInput.ini, расположение файла зависит от операционной системы.
Шаг 2: После открытия файла Вы увидите очень большой текст. Чтобы сэкономить время, просто скопируйте весь этот текст и вставьте его в Ваш UTInput.ini (По сути Вы удаляете то, что находится там и заменяете этим)
Шаг 3: Теперь все кнопки работают, и всё будет так, как на картинке сверху. Но Вам ещё нужно сделать одну вещь, перед тем как играть со спит-скрином.
Откройте UTGame.ini (та же самая папка)
Затем ищите следующую строчку:
Шаг 4:Теперь можно играть. Как только начнёте, второй игрок уже будет в игре. Веселитесь!
Полезные команды (вводятся в консоль):
Code Effect
debugcreateplayer 0 (Спавнит игрока 0)
debugcreateplayer 1 (Спавнит игрока 1)
debugcreateplayer 2 (Спавнит игрока 2)
debugcreateplayer 3 (Спавнит игрока 3)
debugremoveplayer 0 (Удаляет игрока 0)
debugremoveplayer 1 (Удаляет игрока 1)
debugremoveplayer 2 (Удаляет игрока 2)
debugremoveplayer 3 (Удаляет игрока 3)
setsplit 1 (Горизонтальный сплит-скрин)
setsplit 2 (Вертикальный сплит-скрин)
ssswapcontrollers (Смена геймпадов)
Split Screen. Режим разделенного экрана
Мультиплеер в игре «Кубок мира по квиддичу»
| |
Получается, что первый игрок сидит справа за компьютером, а второй игрок — слева.
Надо сказать, что раскладка для второго игрока очень неудобна, растянута, и более компактной её сделать нельзя, т.к. на буквенные символы раскладка не реагирует.
Возможна комбинация клавиатуры с геймпадом.
| |
| |
Игра на мультиплеере отличается от одиночной игры против компьютера, т.к. второй игрок тоже не лыком шит, хочет выиграть и не так легко подпустит к своим воротам.
Именно здесь можно задействовать всё разнообразие стратегий — тянуть время или ускорить матч. Действия игроков видны со спины, при потере квофла камера разворачивается к твоим воротам.
Соревнование в ловле снитча добавит азарта — здесь даже проигравший может вырвать ускользнувшую было победу обратно.
| |
Мультиплеер в играх ЛЕГО Гарри Поттер
В играх ЛЕГО Гарри Поттер мультиплеер можно вовсе не настраивать, стоит лишь нажать в процессе игры клавишу F2 — и второй игрок подключен.
Достаточно одной клавиатуры для обоих игроков. Возможна комбинация с геймпадом и клавиатурой.
ЛЕГО 1-4 | ЛЕГО 5-7 |
| |
ЛЕГО 1-4 | ЛЕГО 5-7 |
| |
Чтобы зайти обратно в игру — нажать F1 для 1-го игрока или F2 для 2-го.
Режим Split Screen в играх ЛЕГО — это простое перечеркивание экрана плавающей линией, которая зафиксирована в центре и вращается относительно этого центра. Доли экрана постоянно меняются в зависимости от передвижений персонажей.
Когда персонажи расходятся в разные стороны — экран делится на части, у каждого игрока свой участок дороги, свой обзор, своя перспектива. Как только игроки приближаются — общий экран возвращается на место.
Мультиплеер в ЛЕГО — это кооперативная, совместная игра. Некоторые миссии удобнее проходить вдвоём : один отвлекает внимание на себя, второй — исполняет задуманное.
Что интересно — внутри мультиплеера еще доступно переключение на 3-го игрока (как и в одиночной игре).
Split Screen в игре «Кубок мира по квиддичу»
На странице использован графический материал из компьютерных игр о Гарри Поттере.
Все права на игры принадлежат компаниям Electronic Arts Inc, Traveller’s Tales.
Размещение и web-дизайн: OOKS.
Подготовка видео : IraOOKS.
Тестирование режима «Drop-in/Drop-out» в игре «ЛЕГО Гарри Поттер: годы 5-7» : Alexms69.
Консультант : Setebos.