make hovering_manager to manage hovers from one place
This commit is contained in:
23
scripts/globals/hovering_manager.gd
Normal file
23
scripts/globals/hovering_manager.gd
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user