Я просто настроил игрушечный проект, чтобы проверить это, и оказалось, что он оказался проще, чем ожидалось.
Вот обзор процесса, а затем последуют примеры кода.
- Добавьте одну основную камеру
- и дополнительную камеру с деревом: Control> Viewport> Camera
- Нарисуйте форму разделенного экрана с помощью Control, используя draw_ * api
- Добавьте шейдер в элемент управления, который берет текстуру и рисует ее в SCREEN_UV
- Получить текстуру области просмотра из области просмотра
- Передайте текстуру области просмотра в шейдер элемента управления каждый кадр.
- Анимироватьразделение с помощью анимации и перерисовки формы элемента управления.
Я не уверен, как сделать границу.
Чтобы сделать соединение с разделением, вам, вероятно, придется сдвинуть элемент управления.сформируйте по толщине границы, а затем сожмите эту границу, когда камеры движутся навстречу друг другу.Используйте это расстояние между игроками для расчета ширины границы.
Разделенная граница также находится под углом между двумя игроками, поэтому при анимации фигуры вы захотите использовать этот угол.Это сделает соединение окна просмотра более плавным.
Контрольный код:
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);
}
Надеюсь, это поможет вам начать!