116 lines
3.8 KiB
GDScript
116 lines
3.8 KiB
GDScript
extends Node2D
|
|
|
|
|
|
var hovered_setpieces: Array[Dictionary] = []
|
|
|
|
@onready var label : Label = $"label"
|
|
func _ready():
|
|
_connect_setpieces(get_parent())
|
|
|
|
func _on_transitioned(s):
|
|
hovered_setpieces.clear()
|
|
$label.hide()
|
|
_connect_setpieces(get_parent())
|
|
|
|
func _connect_setpieces(scene: Node) -> void:
|
|
for n in scene.find_children("*", "SetPiece", true, false):
|
|
print("LOOKING AT", n)
|
|
n.connect("entered", Callable(self, "_on_setpiece_entered"))
|
|
n.connect("exited", Callable(self, "_on_setpiece_exited"))
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
func _process(delta):
|
|
#var ideal:Vector2 = $"..".to_local(get_global_mouse_position())
|
|
#var bg = $"..".find_child("bg")
|
|
#var far_point = self.to_global(Vector2(bg.texture.get_width(), bg.texture.get_height() ) * bg.get_global_transform())
|
|
##self.position.x = clamp(ideal.x, 0, far_point.x - 200)
|
|
#var camera = $"..".find_child("Camera2D")
|
|
#var cam = get_viewport()
|
|
#var z = cam.get_visible_rect()
|
|
#var cam2 = cam.get_camera_2d()
|
|
#cam2.get_screen_transform()
|
|
#self.position.x = clamp(ideal.x, z.position.x, z.end.x - 500)
|
|
#self.position.y = clamp(ideal.y, z.position.y, z.end.y - 50)
|
|
#
|
|
#var viewport = get_viewport()
|
|
#var viewport_size = viewport.get_visible_rect().size
|
|
#
|
|
#var camera_position = cam2.global_position
|
|
#
|
|
#var margin = 10
|
|
## Example positioning: Top-left corner of the viewport
|
|
#var start = Vector2(camera_position.x - viewport_size.x / 2 + margin, camera_position.y - viewport_size.y / 2 + margin)
|
|
#var end = start + viewport_size
|
|
## Here 'margin' is the distance you want to keep from the viewport edge
|
|
#
|
|
#
|
|
##print("ideal", ideal, "start", start, "end", end)
|
|
#print(cam2.get_screen_center_position())
|
|
## Adjust this to keep the label within the viewport bounds
|
|
#global_position = Vector2(clamp(ideal.x, start.x, end.x - 400), clamp(ideal.y, start.y, end.y))
|
|
var viewport = get_viewport_rect()
|
|
var mouse_pos = get_viewport().get_mouse_position()
|
|
|
|
# Obtain camera information if camera is used
|
|
var camera = get_viewport().get_camera_2d()
|
|
mouse_pos = camera.get_global_mouse_position()
|
|
if camera:
|
|
# Calculate the screen boundaries considering the camera's position and zoom
|
|
var cam_top_left = camera.get_screen_center_position() - (viewport.size * 0.5 / camera.zoom)
|
|
var cam_bottom_right = camera.get_screen_center_position() + (viewport.size * 0.5 / camera.zoom)
|
|
|
|
# Clamp mouse position to camera's visible area
|
|
var margin = 100
|
|
var s = label.size
|
|
mouse_pos.x = clamp(mouse_pos.x, cam_top_left.x + margin, cam_bottom_right.x - label.size.x - margin)
|
|
mouse_pos.y = clamp(mouse_pos.y, cam_top_left.y, cam_bottom_right.y)
|
|
|
|
|
|
# Update label position
|
|
global_position = mouse_pos
|
|
|
|
|
|
func _on_setpiece_entered(lab: String) -> void:
|
|
var piece = get_setpiece_by_label(lab)
|
|
if piece:
|
|
var entry = {"label": lab, "priority": piece.priority}
|
|
if not _has_entry_with_label(lab):
|
|
hovered_setpieces.append(entry)
|
|
_update_label()
|
|
|
|
|
|
func _on_setpiece_exited(lab: String) -> void:
|
|
for i in range(hovered_setpieces.size()):
|
|
if hovered_setpieces[i].label == lab:
|
|
hovered_setpieces.remove_at(i)
|
|
break
|
|
_update_label()
|
|
|
|
|
|
func _has_entry_with_label(lab: String) -> bool:
|
|
for entry in hovered_setpieces:
|
|
if entry.label == lab:
|
|
return true
|
|
return false
|
|
|
|
func get_setpiece_by_label(lab: String) -> SetPiece:
|
|
var scene = get_parent()
|
|
for child in scene.find_children("*", "SetPiece", true, false):
|
|
if child is SetPiece and child.label == lab:
|
|
return child
|
|
return null
|
|
|
|
func _update_label() -> void:
|
|
print(hovered_setpieces)
|
|
if hovered_setpieces.is_empty():
|
|
$label.hide()
|
|
return
|
|
|
|
hovered_setpieces.sort_custom(func(a, b): return b.priority > a.priority)
|
|
var top_entry = hovered_setpieces[0]
|
|
$label.show()
|
|
$label.text = top_entry.label
|
|
|
|
var size = label.label_settings.font.get_string_size(top_entry.label, HORIZONTAL_ALIGNMENT_LEFT, 200, 32)
|
|
label.size = size
|