106 lines
2.1 KiB
GDScript
106 lines
2.1 KiB
GDScript
@tool
|
|
@icon("uid://2e0o5lq5u7qj")
|
|
class_name PlayerRespawnPoint
|
|
extends Node2D
|
|
|
|
var _can_respawn: bool = false
|
|
const avatar_scene := preload("res://_player/Avatar.tscn")
|
|
|
|
func _ready() -> void:
|
|
if not Engine.is_editor_hint():
|
|
|
|
GlobalEvent.player_dead.connect(_on_player_dead)
|
|
|
|
func _on_player_dead(player: Player) -> void:
|
|
call_deferred(&"respawn_avatar")
|
|
|
|
func _process(delta: float) -> void:
|
|
queue_redraw()
|
|
|
|
func _draw() -> void:
|
|
# 只在编辑器绘制
|
|
if not Engine.is_editor_hint():
|
|
return
|
|
|
|
var color := Color(0.2, 0.9, 0.4, 0.8)
|
|
var line_width := 2.0
|
|
|
|
# 尺寸参数(都可以微调)
|
|
var outer_radius := 16.0
|
|
var inner_gap := 6.0
|
|
var line_length := 10.0
|
|
var center_radius := 3.0
|
|
|
|
var center := Vector2.ZERO
|
|
|
|
# —— 外圈圆环 ——
|
|
draw_arc(
|
|
center,
|
|
outer_radius,
|
|
0.0,
|
|
TAU,
|
|
48, # 分段数,越大越圆
|
|
color,
|
|
line_width
|
|
)
|
|
|
|
# —— 准星十字 ——
|
|
# 上
|
|
draw_line(
|
|
center + Vector2(0, -inner_gap),
|
|
center + Vector2(0, -inner_gap - line_length),
|
|
color,
|
|
line_width
|
|
)
|
|
# 下
|
|
draw_line(
|
|
center + Vector2(0, inner_gap),
|
|
center + Vector2(0, inner_gap + line_length),
|
|
color,
|
|
line_width
|
|
)
|
|
# 左
|
|
draw_line(
|
|
center + Vector2(-inner_gap, 0),
|
|
center + Vector2(-inner_gap - line_length, 0),
|
|
color,
|
|
line_width
|
|
)
|
|
# 右
|
|
draw_line(
|
|
center + Vector2(inner_gap, 0),
|
|
center + Vector2(inner_gap + line_length, 0),
|
|
color,
|
|
line_width
|
|
)
|
|
|
|
# —— 中心圆点 ——
|
|
draw_circle(center, center_radius, color)
|
|
|
|
|
|
func push_respawner() -> void:
|
|
_can_respawn = true
|
|
|
|
func pop_respawner() -> void:
|
|
_can_respawn = false
|
|
|
|
func respawn_avatar() -> CharacterBody2D:
|
|
if not _can_respawn: return null
|
|
|
|
if not avatar_scene:
|
|
return null
|
|
|
|
var new_avatar : Player = avatar_scene.instantiate()
|
|
var pc : PlayerController = GlobalEvent.get_player_controller()
|
|
if not pc or not new_avatar:
|
|
return null
|
|
|
|
pc.unbind_avatar()
|
|
pc.bind_avatar(new_avatar)
|
|
|
|
new_avatar.position = self.global_position
|
|
get_tree().current_scene.add_child(new_avatar)
|
|
|
|
GlobalEvent.player_spawned.emit(new_avatar)
|
|
return new_avatar
|