extends PanelContainer #这是批量购买弹窗 @onready var title: Label = $VBox/Title #弹窗标题 @onready var contents: Label = $VBox/Contents #弹窗内容 @onready var buy_num_edit: LineEdit = $VBox/BuyNumEdit #购买数量 @onready var sure_button: Button = $VBox/HBox/SureButton #确认购买 @onready var cancel_button: Button = $VBox/HBox/CancelButton #取消购买 # 当前购买的商品信息 var current_item_name: String = "" var current_item_cost: int = 0 var current_item_desc: String = "" var current_buy_type: String = "" # "seed" 或 "item" var max_stock: int = 999999999 # 最大库存限制,默认无限制 # 回调函数,用于处理确认购买 var confirm_callback: Callable var cancel_callback: Callable func _ready(): # 连接按钮信号 sure_button.pressed.connect(_on_sure_button_pressed) cancel_button.pressed.connect(_on_cancel_button_pressed) # 设置数量输入框的默认值和限制 buy_num_edit.text = "1" buy_num_edit.placeholder_text = "请输入购买数量" # 只允许输入数字 buy_num_edit.text_changed.connect(_on_buy_num_changed) # 默认隐藏弹窗 self.hide() #面板显示与隐藏切换处理 func _on_visibility_changed(): if visible: GlobalVariables.isZoomDisabled = true pass else: GlobalVariables.isZoomDisabled = false pass # 显示批量购买弹窗 func show_buy_popup(item_name: String, item_cost: int, item_desc: String, buy_type: String, on_confirm: Callable, on_cancel: Callable = Callable(), stock_limit: int = 999999999): current_item_name = item_name current_item_cost = item_cost current_item_desc = item_desc current_buy_type = buy_type confirm_callback = on_confirm cancel_callback = on_cancel max_stock = stock_limit # 设置弹窗内容 if buy_type == "seed": title.text = "批量购买种子" else: title.text = "批量购买道具" # 添加库存信息到内容中 var stock_info = "" if stock_limit < 999999999: stock_info = "\n当前库存: " + str(stock_limit) + " 个" contents.text = str( "商品名称: " + item_name + "\n" + "单价: " + str(item_cost) + " 元\n" + "描述: " + item_desc + stock_info + "\n\n" + "请输入购买数量:" ) # 重置购买数量为1 buy_num_edit.text = "1" # 显示弹窗并居中 self.show() # 处理数量输入变化 func _on_buy_num_changed(new_text: String): # 只允许输入数字 var filtered_text = "" for char in new_text: if char.is_valid_int(): filtered_text += char # 检查是否超过库存限制并自动修正 if not filtered_text.is_empty(): var quantity = filtered_text.to_int() if quantity > max_stock: filtered_text = str(max_stock) elif quantity > 999999999: filtered_text = "999999999" if filtered_text != new_text: buy_num_edit.text = filtered_text buy_num_edit.caret_column = filtered_text.length() # 更新总价显示 _update_total_cost() # 更新总价显示 func _update_total_cost(): var quantity = get_buy_quantity() var total_cost = quantity * current_item_cost var cost_info = "\n总价: " + str(total_cost) + " 元" # 更新内容显示 var base_content = str( "商品名称: " + current_item_name + "\n" + "单价: " + str(current_item_cost) + " 元\n" + "描述: " + current_item_desc + "\n\n" + "请输入购买数量:" ) contents.text = base_content + cost_info # 获取购买数量 func get_buy_quantity() -> int: var text = buy_num_edit.text.strip_edges() if text.is_empty(): return 1 var quantity = text.to_int() return max(1, quantity) # 至少购买1个 # 确认购买按钮处理 func _on_sure_button_pressed(): var quantity = get_buy_quantity() if quantity <= 0: _show_error("购买数量必须大于0") return # 检查是否超过库存限制 if quantity > max_stock: _show_error("购买数量超过库存限制!最大可购买: " + str(max_stock)) return # 调用确认回调函数 if confirm_callback.is_valid(): confirm_callback.call(current_item_name, current_item_cost, quantity, current_buy_type) # 隐藏弹窗 self.hide() # 取消购买按钮处理 func _on_cancel_button_pressed(): # 调用取消回调函数 if cancel_callback.is_valid(): cancel_callback.call() # 隐藏弹窗 self.hide() # 显示错误信息 func _show_error(message: String): # 这里可以显示Toast或者其他错误提示 if has_node("/root/Toast"): get_node("/root/Toast").show(message, Color.RED, 2.0, 1.0) else: print("批量购买弹窗错误: " + message)