Files
fps_project_1/scripts/weapon_select.gd

136 lines
3.4 KiB
GDScript

#@tool
extends Control
@export var line_width : int = 4
@onready var player: CharacterBody3D = $"../../../.."
@onready var level_control = get_tree().current_scene
var selecting
var options = []
const outer_radius : int = 500
const inner_radius : int = 100
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 open():
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
selecting = true
show()
update_weapon_list()
func close():
selecting = false
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)
func _input(event: InputEvent) -> void:
if selecting:
const MOUSE_DEADZONE = .01
if event is InputEventMouseMotion:
if abs(event.relative.x) > MOUSE_DEADZONE or abs(event.relative.x) > MOUSE_DEADZONE:
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if selecting:
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)))
var joy_input = joypad_select()
if abs(joy_input) > Vector2.ZERO:
var joy_rads = fposmod(joypad_select().angle() * -1, TAU)
selection = ceil((joy_rads / TAU) * (len(options)))
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 = GameGlobals.held_guns
func joypad_select():
var joy_out = Vector2.ZERO
# Joypad right stick look control
var xAxis = Input.get_joy_axis(0,JOY_AXIS_RIGHT_X)
var yAxis = Input.get_joy_axis(0,JOY_AXIS_RIGHT_Y)
if abs(xAxis) > player.R_JOYSTICK_DEADZONE:
joy_out.x = xAxis
if abs(yAxis) > player.R_JOYSTICK_DEADZONE:
joy_out.y = yAxis
return joy_out