make hovering_manager to manage hovers from one place

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

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