Камера с разделенным экраном в стиле Лего в Годо - PullRequest
0 голосов
/ 08 октября 2018

Я хочу иметь камеру с разделенным экраном в стиле lego с плавными переходами.

У кого-нибудь есть опыт создания чего-то подобного?Я думал о создании одной нормальной камеры, а затем другой камеры для второго плеера, которая по умолчанию не будет видна.Затем, когда мне захотелось бы показать это, я бы нарисовал треугольник, чтобы разделить экран, и установил его текстуру в качестве камеры № 2.

Я нашел эту реализацию Unity , но я не смогреализовать это в Годо.Мне удалось создать второй видовой экран с собственной камерой, но по какой-то причине вид второй камеры ничего не показывает.Я думаю, что проблема в том, что мир второго видового экрана отличается от основного видового экрана.

Исходный код можно найти здесь .

1 Ответ

0 голосов
/ 15 октября 2018

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

Вот обзор процесса, а затем последуют примеры кода.

  1. Добавьте одну основную камеру
  2. и дополнительную камеру с деревом: Control> Viewport> Camera
  3. Нарисуйте форму разделенного экрана с помощью Control, используя draw_ * api
  4. Добавьте шейдер в элемент управления, который берет текстуру и рисует ее в SCREEN_UV
  5. Получить текстуру области просмотра из области просмотра
  6. Передайте текстуру области просмотра в шейдер элемента управления каждый кадр.
  7. Анимироватьразделение с помощью анимации и перерисовки формы элемента управления.

Я не уверен, как сделать границу.

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

Разделенная граница также находится под углом между двумя игроками, поэтому при анимации фигуры вы захотите использовать этот угол.Это сделает соединение окна просмотра более плавным.

Контрольный код:

extends Control

func _draw():
    # in this case animate tl and bml to get the 
    # rotating split like effect in the lego game
    var tl = Vector2()
    var tr = rect_size
    tr.y = 0
    var br = rect_size
    var bml = rect_size
    bml.x /= 2.0
    draw_polygon([tl, tr, br, bml, tl], [Color(), Color(), Color(), Color(), Color()], [])

func _process(d):
    material.set_shader_param('viewport', $Viewport.get_texture())

Код шейдера:

shader_type canvas_item;

uniform sampler2D viewport;

void fragment(){
    COLOR=texture(viewport, SCREEN_UV);
}

Надеюсь, это поможет вам начать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...