Manage nodes in TextViewport dynamically
This commit is contained in:
parent
eaf9edfd53
commit
7833a1c756
6 changed files with 42 additions and 22 deletions
|
@ -41,9 +41,6 @@ func _pre_load_checks() -> bool:
|
||||||
if NodeRegistry.level_root_container == null:
|
if NodeRegistry.level_root_container == null:
|
||||||
push_error("Can't load level, level_root_container is not registered yet.")
|
push_error("Can't load level, level_root_container is not registered yet.")
|
||||||
return false
|
return false
|
||||||
if NodeRegistry.level_text_root_container == null:
|
|
||||||
push_error("Can't load level, level_text_root_container is not registered yet.")
|
|
||||||
return false
|
|
||||||
if NodeRegistry.player == null:
|
if NodeRegistry.player == null:
|
||||||
push_error("Can't load entrypoint, player is not registered yet.")
|
push_error("Can't load entrypoint, player is not registered yet.")
|
||||||
return false
|
return false
|
||||||
|
@ -61,18 +58,12 @@ func load_scene(scn_name: String, force_reload: bool = false) -> bool:
|
||||||
unload_scene()
|
unload_scene()
|
||||||
var scn: Node2D = load(SCENES[scn_name]).instantiate()
|
var scn: Node2D = load(SCENES[scn_name]).instantiate()
|
||||||
NodeRegistry.level_root_container.add_child(scn)
|
NodeRegistry.level_root_container.add_child(scn)
|
||||||
for t in get_tree().get_nodes_in_group("text_viewport"):
|
|
||||||
t.reparent(NodeRegistry.level_text_root_container)
|
|
||||||
return true
|
return true
|
||||||
|
|
||||||
func unload_scene():
|
func unload_scene():
|
||||||
for container in [
|
if NodeRegistry.level_root_container != null:
|
||||||
NodeRegistry.level_root_container,
|
for c in NodeRegistry.level_root_container.get_children():
|
||||||
NodeRegistry.level_text_root_container
|
c.queue_free()
|
||||||
]:
|
|
||||||
if container != null:
|
|
||||||
for c in container.get_children():
|
|
||||||
c.queue_free()
|
|
||||||
|
|
||||||
func load_entrypoint(ep_name: String) -> bool: # returns true on success
|
func load_entrypoint(ep_name: String) -> bool: # returns true on success
|
||||||
if not ep_name in ENTRYPOINTS:
|
if not ep_name in ENTRYPOINTS:
|
||||||
|
|
|
@ -2,4 +2,3 @@ extends Node
|
||||||
|
|
||||||
var player: CharacterBody2D
|
var player: CharacterBody2D
|
||||||
var level_root_container: Node2D
|
var level_root_container: Node2D
|
||||||
var level_text_root_container: Node2D
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
extends Camera2D
|
|
||||||
|
|
||||||
func _physics_process(_delta: float) -> void:
|
|
||||||
var orig_camera: Camera2D = NodeRegistry.player.camera
|
|
||||||
self.global_position = -orig_camera.get_viewport_transform().origin
|
|
36
core/text_viewport.gd
Normal file
36
core/text_viewport.gd
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
extends SubViewport
|
||||||
|
|
||||||
|
# All nodes from the MainViewport that are in the text_viewport group
|
||||||
|
# are shadowed in this SubViewport
|
||||||
|
|
||||||
|
@onready var camera: Camera2D = $Camera2D
|
||||||
|
@onready var container: Node2D = %LevelTextRootContainer
|
||||||
|
|
||||||
|
# map nodes to its shadowed nodes
|
||||||
|
var mapping: Dictionary = {}
|
||||||
|
|
||||||
|
func update_mapping():
|
||||||
|
var nodes = get_tree().get_nodes_in_group("text_viewport")
|
||||||
|
for k in mapping.keys():
|
||||||
|
if not is_instance_valid(k): # check if node is gone
|
||||||
|
container.remove_child(mapping[k])
|
||||||
|
mapping.erase(k)
|
||||||
|
for n in nodes:
|
||||||
|
if not n in mapping.keys():
|
||||||
|
var dup = n.duplicate()
|
||||||
|
dup.remove_from_group("text_viewport")
|
||||||
|
mapping[n] = dup
|
||||||
|
container.add_child(dup)
|
||||||
|
|
||||||
|
func _process(_delta: float) -> void:
|
||||||
|
update_mapping()
|
||||||
|
# update shadowed nodes
|
||||||
|
for k in mapping:
|
||||||
|
var v = mapping[k]
|
||||||
|
if k is Label and k.text != v.text:
|
||||||
|
v.text = k.text
|
||||||
|
if (k is Label or k is Node2D):
|
||||||
|
mapping[k].global_position = k.global_position
|
||||||
|
# camera position
|
||||||
|
var orig_camera: Camera2D = NodeRegistry.player.camera
|
||||||
|
camera.global_position = -orig_camera.get_viewport_transform().origin
|
1
main.gd
1
main.gd
|
@ -3,5 +3,4 @@ extends Node
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
NodeRegistry.player = %Player
|
NodeRegistry.player = %Player
|
||||||
NodeRegistry.level_root_container = %LevelRootContainer
|
NodeRegistry.level_root_container = %LevelRootContainer
|
||||||
NodeRegistry.level_text_root_container = %LevelTextRootContainer
|
|
||||||
Levels.load_menu()
|
Levels.load_menu()
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
[ext_resource type="Script" path="res://main.gd" id="1_m407c"]
|
[ext_resource type="Script" path="res://main.gd" id="1_m407c"]
|
||||||
[ext_resource type="PackedScene" uid="uid://dxp3dru2lrv6h" path="res://core/shaders/outline/outline_canvas_layer.tscn" id="2_ta1pa"]
|
[ext_resource type="PackedScene" uid="uid://dxp3dru2lrv6h" path="res://core/shaders/outline/outline_canvas_layer.tscn" id="2_ta1pa"]
|
||||||
[ext_resource type="PackedScene" uid="uid://jmy11lqcs4c" path="res://core/shaders/distortion/distortion_canvas_layer.tscn" id="3_emkei"]
|
[ext_resource type="PackedScene" uid="uid://jmy11lqcs4c" path="res://core/shaders/distortion/distortion_canvas_layer.tscn" id="3_emkei"]
|
||||||
|
[ext_resource type="Script" path="res://core/text_viewport.gd" id="4_hxymt"]
|
||||||
[ext_resource type="PackedScene" uid="uid://ebb4pfxklatj" path="res://player/player.tscn" id="5_0agpg"]
|
[ext_resource type="PackedScene" uid="uid://ebb4pfxklatj" path="res://player/player.tscn" id="5_0agpg"]
|
||||||
[ext_resource type="Script" path="res://core/shadowing_camera_2d.gd" id="5_rlmue"]
|
|
||||||
|
|
||||||
[node name="Main" type="Control"]
|
[node name="Main" type="Control"]
|
||||||
layout_mode = 3
|
layout_mode = 3
|
||||||
|
@ -54,13 +54,13 @@ handle_input_locally = false
|
||||||
canvas_item_default_texture_filter = 0
|
canvas_item_default_texture_filter = 0
|
||||||
size = Vector2i(800, 450)
|
size = Vector2i(800, 450)
|
||||||
render_target_update_mode = 4
|
render_target_update_mode = 4
|
||||||
|
script = ExtResource("4_hxymt")
|
||||||
|
|
||||||
[node name="LevelTextRootContainer" type="Node2D" parent="TextViewportContainer/TextViewport"]
|
[node name="LevelTextRootContainer" type="Node2D" parent="TextViewportContainer/TextViewport"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
|
|
||||||
[node name="ShadowingCamera2D" type="Camera2D" parent="TextViewportContainer/TextViewport"]
|
[node name="Camera2D" type="Camera2D" parent="TextViewportContainer/TextViewport"]
|
||||||
editor_description = "Shadows the camera in MainViewportContainer"
|
editor_description = "Shadows the camera in MainViewportContainer"
|
||||||
anchor_mode = 0
|
anchor_mode = 0
|
||||||
script = ExtResource("5_rlmue")
|
|
||||||
|
|
||||||
[node name="DistortionShader" parent="." instance=ExtResource("3_emkei")]
|
[node name="DistortionShader" parent="." instance=ExtResource("3_emkei")]
|
||||||
|
|
Reference in a new issue