make hovering_manager to manage hovers from one place

This commit is contained in:
Teatov 2024-10-06 18:34:54 +10:00
parent adbf71ad02
commit 2eb3369b95
7 changed files with 52 additions and 52 deletions

View File

@ -25,6 +25,7 @@ FullscreenManager="*res://scripts/globals/fullscreen_manager.gd"
QuittingManager="*res://scripts/globals/quitting_manager.gd"
DebugDraw="*res://scripts/globals/debug_draw.gd"
UiManager="*res://scripts/globals/ui_manager.gd"
HoveringManager="*res://scripts/globals/hovering_manager.gd"
[debug]

View File

@ -1,10 +1,9 @@
[gd_scene load_steps=19 format=3 uid="uid://ceru75se7ifkb"]
[gd_scene load_steps=18 format=3 uid="uid://ceru75se7ifkb"]
[ext_resource type="Script" path="res://scripts/main_camera.gd" id="1_gnxhh"]
[ext_resource type="PackedScene" uid="uid://cfixshlmwhpmi" path="res://scenes/units/test_unit.tscn" id="2_4bgm6"]
[ext_resource type="PackedScene" uid="uid://d4c6ujs1ra1ob" path="res://scenes/units/aphid.tscn" id="3_eh22j"]
[ext_resource type="Script" path="res://scripts/selector.gd" id="4_5avpj"]
[ext_resource type="PackedScene" uid="uid://k11usj2shbtr" path="res://scenes/units/ant_nitwit.tscn" id="4_jcvdx"]
[ext_resource type="Texture2D" uid="uid://bgbe5l2woe5b2" path="res://assets/textures/gui/selection_box.png" id="5_g1xtt"]
[ext_resource type="PackedScene" uid="uid://clftjlaotf2g2" path="res://scenes/structures/Anthill.tscn" id="7_f30w3"]
[ext_resource type="PackedScene" uid="uid://d8ut24fit87x" path="res://scenes/ui/anthill_info.tscn" id="8_ohyy4"]
@ -91,18 +90,19 @@ shadow_enabled = true
[node name="TestUnits" type="Node" parent="Units"]
[node name="TestUnit" parent="Units/TestUnits" instance=ExtResource("2_4bgm6")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.97063, 0, -0.12038)
[node name="TestUnit2" parent="Units/TestUnits" instance=ExtResource("2_4bgm6")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.96245, 0, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.93308, 0, -0.12038)
[node name="TestUnit3" parent="Units/TestUnits" instance=ExtResource("2_4bgm6")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.97171, 0, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.94234, 0, -0.12038)
[node name="TestUnit4" parent="Units/TestUnits" instance=ExtResource("2_4bgm6")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.80899, 0, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.77962, 0, -0.12038)
[node name="TestUnit5" parent="Units/TestUnits" instance=ExtResource("2_4bgm6")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.67063, 0, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.64126, 0, -0.12038)
[node name="Aphids" type="Node" parent="Units"]
@ -120,16 +120,16 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.19235, -2.38419e-07, -2.63
[node name="Nitwits" type="Node" parent="Units"]
[node name="AntNitwit" parent="Units/Nitwits" instance=ExtResource("4_jcvdx")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.449057, 0, -3.08498)
[node name="Structures" type="Node" parent="."]
[node name="AntNitwit2" parent="Units/Nitwits" instance=ExtResource("4_jcvdx")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.971017, 0, -3.08498)
[node name="Anthill" parent="Structures" instance=ExtResource("7_f30w3")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.79455, 0, 1.78811)
[node name="AntNitwit3" parent="Units/Nitwits" instance=ExtResource("4_jcvdx")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.39845, 0, -3.08498)
[node name="UI" type="Node" parent="."]
[node name="Selector" type="Node" parent="."]
[node name="AnthillInfo" parent="UI" instance=ExtResource("8_ohyy4")]
[node name="Selector" type="Node3D" parent="."]
script = ExtResource("4_5avpj")
[node name="SelectionRect" type="Panel" parent="Selector"]
@ -146,15 +146,6 @@ input_ray_pickable = false
[node name="FrustrumCollisionShape" type="CollisionShape3D" parent="Selector/FrustrumArea"]
shape = SubResource("ConvexPolygonShape3D_n34fh")
[node name="Structures" type="Node" parent="."]
[node name="Anthill" parent="Structures" instance=ExtResource("7_f30w3")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.79455, 0, 1.78811)
[node name="UI" type="Node" parent="."]
[node name="AnthillInfo" parent="UI" instance=ExtResource("8_ohyy4")]
[node name="MainCamera" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.819152, 0.573576, 0, -0.573576, 0.819152, 0, 1, 2)
current = true

View File

@ -0,0 +1,23 @@
extends Node3D
var hovered_node: Variant
var mouse_pos: Vector2 = Vector2.ZERO
@onready var camera: Camera3D = get_viewport().get_camera_3d()
func _physics_process(_delta: float) -> void:
var space_state := get_world_3d().direct_space_state
var from := camera.project_ray_origin(mouse_pos)
var to := from + camera.project_ray_normal(mouse_pos) * (camera.far - 1)
var query := PhysicsRayQueryParameters3D.create(from, to)
var result := space_state.intersect_ray(query)
if not result:
hovered_node = null
return
hovered_node = result["collider"]
func _input(event: InputEvent) -> void:
if event is InputEventMouseMotion:
mouse_pos = (event as InputEventMouseMotion).position

View File

@ -11,11 +11,10 @@ var click_position: Vector2 = Vector2.ZERO
func _ready() -> void:
assert(hover_sprite != null, "hover_sprite missing!")
mouse_entered.connect(_on_mouse_entered)
mouse_exited.connect(_on_mouse_exited)
func _process(_delta: float) -> void:
hovered = HoveringManager.hovered_node == self
_animate()
@ -42,10 +41,3 @@ func _click() -> void:
func _animate() -> void:
hover_sprite.visible = hovered
func _on_mouse_entered() -> void:
hovered = true
func _on_mouse_exited() -> void:
hovered = false

View File

@ -1,4 +1,4 @@
extends Node
extends Node3D
const MIN_DRAG_DISTANCE: float = 15
const UNIT_SELECT_OFFSET: float = 0.25
@ -56,10 +56,11 @@ func _input(event: InputEvent) -> void:
elif selecting:
_set_selection_state(false)
if event is InputEventMouseMotion and mouse_pressed:
var motion_event := event as InputEventMouseMotion
selection_rect.size = motion_event.position - selection_rect.position
if event is InputEventMouseMotion:
if mouse_pressed:
var mouse_pos := (event as InputEventMouseMotion).position
selection_rect.size = mouse_pos - selection_rect.position
func _handle_frustrum_shape() -> void:
var viewport_size := get_viewport().get_visible_rect().size
@ -109,10 +110,10 @@ func _set_selection_state(hover: bool) -> void:
if unit is ControlledUnit:
var controlled_unit := unit as ControlledUnit
if hover:
controlled_unit.set_hovered(rect_abs.has_point(point))
controlled_unit.set_hovered_rect(rect_abs.has_point(point))
else:
controlled_unit.set_selected(rect_abs.has_point(point))
controlled_unit.set_hovered(false)
controlled_unit.set_hovered_rect(false)
func _on_frustrum_area_unit_entered(unit: Node3D) -> void:

View File

@ -26,7 +26,7 @@ func _ready() -> void:
assert(selection_sprite != null, "selection_sprite missing!")
set_selected(false)
if spawn_pos != null:
if spawn_pos != null and spawn_pos != Vector3.ZERO:
global_position = spawn_pos
super._ready()

View File

@ -8,6 +8,7 @@ var max_wander_distance: float = 5
var min_wander_interval: float = 0.25
var max_wander_interval: float = 5
var hovered_rect: bool = false
var hovered: bool = false
var is_on_screen: bool = false
var wandering_timer: float = 0
@ -28,12 +29,9 @@ func _ready() -> void:
assert(visibility_notifier != null, "visibility_notifier missing!")
wandering_center = global_position
set_hovered(false)
nav_agent.max_speed = MOVE_SPEED
nav_agent.velocity_computed.connect(_on_nav_agent_velocity_computed)
set_max_slides(2)
mouse_entered.connect(_on_mouse_entered)
mouse_exited.connect(_on_mouse_exited)
visibility_notifier.screen_entered.connect(
_on_visibility_notifier_screen_entered,
)
@ -43,15 +41,17 @@ func _ready() -> void:
func _process(delta: float) -> void:
hovered = HoveringManager.hovered_node == self
_animate(delta)
hover_sprite.visible = hovered or hovered_rect
func _physics_process(_delta: float) -> void:
_navigate()
func set_hovered(on: bool) -> void:
hovered = on
func set_hovered_rect(on: bool) -> void:
hovered_rect = on
func _navigate() -> void:
@ -111,14 +111,6 @@ func _on_nav_agent_velocity_computed(safe_velocity: Vector3) -> void:
move_and_slide()
func _on_mouse_entered() -> void:
set_hovered(true)
func _on_mouse_exited() -> void:
set_hovered(false)
func _on_visibility_notifier_screen_entered() -> void:
is_on_screen = true