104 lines
2.5 KiB
GDScript
104 lines
2.5 KiB
GDScript
#@tool
|
|
extends Control
|
|
|
|
@export var outer_radius : int = 256
|
|
@export var inner_radius : int = 256
|
|
@export var line_width : int = 4
|
|
|
|
var options = []
|
|
|
|
@onready var level_control = get_tree().current_scene
|
|
|
|
const bkg_color : Color = Color(1, 1, 1, .5)
|
|
const line_color : Color = Color(1,1,1)
|
|
const select_color = Color(1, 1, 1, .5)
|
|
const IMAGE_SIZE = Vector2(512,512)
|
|
|
|
|
|
var selection
|
|
|
|
func close():
|
|
hide()
|
|
return selection
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready() -> void:
|
|
update_weapon_list()
|
|
SignalBus.weapon_list_changed.connect(update_weapon_list)
|
|
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
func _process(delta: float) -> void:
|
|
|
|
var mouse_pos = get_local_mouse_position()
|
|
var mouse_radius = mouse_pos.length()
|
|
|
|
if mouse_radius < inner_radius:
|
|
selection = null
|
|
else:
|
|
var mouse_rads = fposmod(mouse_pos.angle() * -1, TAU)
|
|
selection = ceil((mouse_rads / TAU) * (len(options)+1))
|
|
|
|
|
|
|
|
queue_redraw()
|
|
|
|
func _draw():
|
|
var offset = IMAGE_SIZE/ -2
|
|
|
|
if selection == null:
|
|
draw_circle(Vector2.ZERO,inner_radius,select_color)
|
|
|
|
|
|
draw_circle(Vector2.ZERO, outer_radius, bkg_color)
|
|
draw_arc(Vector2.ZERO,inner_radius,0, TAU, 128,line_color,line_width,true)
|
|
|
|
if len(options) >= 1:
|
|
|
|
# draw separator lines
|
|
for i in range(len(options)):
|
|
var rads = TAU * i / (len(options))
|
|
var point = Vector2.from_angle(rads)
|
|
draw_line(
|
|
point * inner_radius,
|
|
point * outer_radius,
|
|
line_color,
|
|
line_width,
|
|
true
|
|
)
|
|
|
|
for i in range(0,len(options)):
|
|
var start_rads = (TAU * (i-1)) / (len(options))
|
|
var end_rads = (TAU * i) / (len(options))
|
|
var mid_rads = (start_rads + end_rads)/2.0 * -1
|
|
var radius_mid = (inner_radius + outer_radius) / 2
|
|
|
|
var draw_pos = radius_mid * Vector2.from_angle(mid_rads) + offset
|
|
|
|
var object = options[i].instantiate()
|
|
var texture = object.gun_icon
|
|
|
|
if selection == i:
|
|
var points_per_arc = 32
|
|
var points_inner = PackedVector2Array()
|
|
var points_outer = PackedVector2Array()
|
|
|
|
for j in range(points_per_arc + 1):
|
|
var angle = start_rads + j * (end_rads - start_rads) / points_per_arc
|
|
points_inner.append(inner_radius * Vector2.from_angle(TAU-angle))
|
|
points_outer.append(outer_radius * Vector2.from_angle(TAU-angle))
|
|
|
|
points_outer.reverse()
|
|
draw_polygon(
|
|
points_inner + points_outer,
|
|
PackedColorArray([select_color])
|
|
)
|
|
|
|
draw_texture(
|
|
texture,
|
|
Vector2(draw_pos)
|
|
)
|
|
|
|
func update_weapon_list():
|
|
options = level_control.held_guns
|