|
|
|
|
extends Control
|
|
|
|
|
|
|
|
|
|
@onready var weapon_scene: PackedScene = preload("res://scene/ui/item/weapon_item.tscn")
|
|
|
|
|
|
|
|
|
|
var item_layout_offset_x: int = 32
|
|
|
|
|
var item_layout_offset_y: int = 16
|
|
|
|
|
var weapon_item_list: Array[Variant] = []
|
|
|
|
|
var weapon_list: Array
|
|
|
|
|
var weapon_index: int
|
|
|
|
|
var weapon_index_dir: int
|
|
|
|
|
var weapon_index_rate: float
|
|
|
|
|
var hide_duration: float
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _process(delta) -> void:
|
|
|
|
|
if not visible:
|
|
|
|
|
return
|
|
|
|
|
if weapon_index_dir:
|
|
|
|
|
item_lerp(weapon_index_dir, weapon_index_rate)
|
|
|
|
|
hide_duration = Setting.weapon_hide_duration
|
|
|
|
|
return
|
|
|
|
|
item_lerp(weapon_index_dir, 1)
|
|
|
|
|
hide_duration -= delta
|
|
|
|
|
if hide_duration <= 0:
|
|
|
|
|
for item in weapon_item_list:
|
|
|
|
|
remove_child(item)
|
|
|
|
|
weapon_item_list.clear()
|
|
|
|
|
visible = false
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func on_weapon_list_changed(list: Array): weapon_list = list
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func on_weapon_index_changed(index: int): weapon_index = index
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func on_weapon_index_change_rate_changed(rate: float): weapon_index_rate = rate
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func on_weapon_index_change_dir_changed(dir: int) -> void:
|
|
|
|
|
weapon_index_dir = dir
|
|
|
|
|
if not weapon_index_dir:
|
|
|
|
|
return
|
|
|
|
|
if not visible:
|
|
|
|
|
visible = true
|
|
|
|
|
for i in range(5): append()
|
|
|
|
|
else:
|
|
|
|
|
if dir > 0:
|
|
|
|
|
push_back()
|
|
|
|
|
pop_front()
|
|
|
|
|
else:
|
|
|
|
|
push_front()
|
|
|
|
|
pop_back()
|
|
|
|
|
hide_duration = Setting.weapon_hide_duration
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func append(): weapon_item_list.append(create_weapon_item(len(weapon_item_list)-2+weapon_index_dir))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func push_front(): weapon_item_list.push_front(create_weapon_item(-2+weapon_index_dir))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func push_back(): weapon_item_list.push_back(create_weapon_item(2+weapon_index_dir))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func pop_front(): remove_child(weapon_item_list.pop_front())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func pop_back(): remove_child(weapon_item_list.pop_back())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func create_weapon_item(offset: int)->WeaponItemSub:
|
|
|
|
|
var weapon_count: int = len(weapon_list)
|
|
|
|
|
var index: int = ((weapon_index + offset) % weapon_count + weapon_count) % weapon_count
|
|
|
|
|
var weapon_item_sub: WeaponItemSub = weapon_scene.instantiate() as WeaponItemSub
|
|
|
|
|
var weapon_cfg: WeaponCfg = weapon_list[index] as WeaponCfg
|
|
|
|
|
add_child(weapon_item_sub)
|
|
|
|
|
weapon_item_sub.init(weapon_cfg.icon)
|
|
|
|
|
return weapon_item_sub
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func item_lerp(dir: int, rate: float):
|
|
|
|
|
for i in range(len(weapon_item_list)):
|
|
|
|
|
var item: WeaponItemSub = weapon_item_list[i] as WeaponItemSub
|
|
|
|
|
var target_index = i-2
|
|
|
|
|
var index = target_index+dir
|
|
|
|
|
var pos_from: Vector2 = get_item_pos(index)
|
|
|
|
|
var pos_to: Vector2 = get_item_pos(target_index)
|
|
|
|
|
var alpha_from: int = 1 if abs(index)<=1 else 0
|
|
|
|
|
var alpha_to: int = 1 if abs(target_index)<=1 else 0
|
|
|
|
|
item.position = lerp(pos_from, pos_to, rate)
|
|
|
|
|
item.update_alpha(alpha_from, alpha_to, rate)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func get_item_pos(offset: int) -> Vector2:
|
|
|
|
|
return Vector2(item_layout_offset_x*offset, item_layout_offset_y if offset else 0)
|