Manage nodes in TextViewport dynamically

This commit is contained in:
ChaoticByte 2024-10-03 14:02:05 +02:00
parent eaf9edfd53
commit 7833a1c756
No known key found for this signature in database
6 changed files with 42 additions and 22 deletions

View file

@ -41,9 +41,6 @@ func _pre_load_checks() -> bool:
if NodeRegistry.level_root_container == null:
push_error("Can't load level, level_root_container is not registered yet.")
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:
push_error("Can't load entrypoint, player is not registered yet.")
return false
@ -61,18 +58,12 @@ func load_scene(scn_name: String, force_reload: bool = false) -> bool:
unload_scene()
var scn: Node2D = load(SCENES[scn_name]).instantiate()
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
func unload_scene():
for container in [
NodeRegistry.level_root_container,
NodeRegistry.level_text_root_container
]:
if container != null:
for c in container.get_children():
c.queue_free()
if NodeRegistry.level_root_container != null:
for c in NodeRegistry.level_root_container.get_children():
c.queue_free()
func load_entrypoint(ep_name: String) -> bool: # returns true on success
if not ep_name in ENTRYPOINTS:

View file

@ -2,4 +2,3 @@ extends Node
var player: CharacterBody2D
var level_root_container: Node2D
var level_text_root_container: Node2D

View file

@ -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
View 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