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 func _process(delta) -> void: if weapon_index_dir: item_lerp(weapon_index_dir, weapon_index_rate) return item_lerp(weapon_index_dir, 1) func on_weapon_list_changed(list: Array): weapon_list = list init_weapon_item() 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 else: if dir > 0: push_back() pop_front() else: push_front() pop_back() 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 init_weapon_item(): for item in weapon_item_list: remove_child(item) weapon_item_list.clear() for i in range(5): append() 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)