优化项目架构
This commit is contained in:
333
SproutFarm-Frontend/Script/BigPanel/ItemStorePanel.gd
Normal file
333
SproutFarm-Frontend/Script/BigPanel/ItemStorePanel.gd
Normal file
@@ -0,0 +1,333 @@
|
||||
extends Panel
|
||||
# 这是道具商店面板,用来展示各种道具
|
||||
|
||||
# 道具商店格子容器
|
||||
@onready var store_grid: GridContainer = $ScrollContainer/Store_Grid
|
||||
@onready var quit_button : Button = $QuitButton
|
||||
@onready var refresh_button : Button = $RefreshButton
|
||||
|
||||
# 预添加常用的面板
|
||||
@onready var main_game = get_node("/root/main")
|
||||
|
||||
@onready var lucky_draw_panel: LuckyDrawPanel = $'../LuckyDrawPanel'
|
||||
@onready var daily_check_in_panel: DailyCheckInPanel = $'../DailyCheckInPanel'
|
||||
@onready var tcp_network_manager_panel: Panel = $'../TCPNetworkManagerPanel'
|
||||
@onready var item_bag_panel: Panel = $'../ItemBagPanel'
|
||||
@onready var player_bag_panel: Panel = $'../PlayerBagPanel'
|
||||
@onready var crop_warehouse_panel: Panel = $'../CropWarehousePanel'
|
||||
@onready var crop_store_panel: Panel = $'../CropStorePanel'
|
||||
@onready var player_ranking_panel: Panel = $'../PlayerRankingPanel'
|
||||
@onready var login_panel: PanelContainer = $'../LoginPanel'
|
||||
@onready var batch_buy_popup: PanelContainer = $'../../DiaLog/BatchBuyPopup'
|
||||
|
||||
|
||||
# 道具配置数据
|
||||
var item_config : Dictionary = {}
|
||||
|
||||
# 准备函数
|
||||
func _ready():
|
||||
# 连接关闭按钮信号
|
||||
quit_button.pressed.connect(self._on_quit_button_pressed)
|
||||
# 连接可见性改变信号
|
||||
visibility_changed.connect(_on_visibility_changed)
|
||||
|
||||
# 隐藏面板(初始默认隐藏)
|
||||
self.hide()
|
||||
|
||||
# 初始化道具商店
|
||||
func init_item_store():
|
||||
# 从主游戏脚本获取道具配置数据
|
||||
_load_item_config_from_main()
|
||||
# 重置筛选状态为显示全部
|
||||
current_filter_type = "全部"
|
||||
update_item_store_ui()
|
||||
|
||||
# 更新道具商店UI
|
||||
func update_item_store_ui():
|
||||
# 清空道具商店格子
|
||||
for child in store_grid.get_children():
|
||||
child.queue_free()
|
||||
|
||||
print("更新道具商店UI,道具种类:", item_config.size(), ",当前筛选:", current_filter_type)
|
||||
|
||||
# 统计符合筛选条件的道具数量
|
||||
var filtered_count = 0
|
||||
|
||||
# 为每个道具配置创建按钮
|
||||
for item_name in item_config.keys():
|
||||
# 检查是否符合筛选条件
|
||||
if not _is_item_match_filter(item_name):
|
||||
continue
|
||||
|
||||
var item_info = item_config[item_name]
|
||||
var item_cost = item_info.get("花费", 0)
|
||||
var item_desc = item_info.get("描述", "暂无描述")
|
||||
|
||||
# 创建道具按钮
|
||||
var button = _create_item_button(item_name, item_cost, item_desc)
|
||||
|
||||
# 更新按钮文本显示价格
|
||||
button.text = str(item_name + "\n价格:" + str(item_cost) + "元")
|
||||
|
||||
# 连接购买点击事件
|
||||
button.pressed.connect(func(): _on_store_item_selected(item_name, item_cost, item_desc))
|
||||
|
||||
store_grid.add_child(button)
|
||||
filtered_count += 1
|
||||
|
||||
print("筛选后显示道具数量:", filtered_count)
|
||||
|
||||
# 创建道具按钮
|
||||
func _create_item_button(item_name: String, item_cost: int, item_desc: String) -> Button:
|
||||
# 使用橙色按钮作为道具商店按钮的样式
|
||||
var button = main_game.item_button.duplicate()
|
||||
|
||||
# 确保按钮可见并可点击
|
||||
button.visible = true
|
||||
button.disabled = false
|
||||
button.focus_mode = Control.FOCUS_ALL
|
||||
|
||||
# 设置按钮文本
|
||||
button.text = item_name
|
||||
|
||||
# 添加工具提示
|
||||
button.tooltip_text = str(
|
||||
"道具: " + item_name + "\n" +
|
||||
"价格: " + str(item_cost) + "元\n" +
|
||||
"描述: " + item_desc + "\n" +
|
||||
"点击购买道具"
|
||||
)
|
||||
|
||||
# 如果按钮有标题标签,设置标题
|
||||
if button.has_node("Title"):
|
||||
button.get_node("Title").text = "商店"
|
||||
button.get_node("Title").modulate = Color.GOLD # 商店标题使用金色
|
||||
|
||||
# 更新按钮的道具图片
|
||||
_update_button_item_image(button, item_name)
|
||||
|
||||
return button
|
||||
|
||||
# 从主游戏脚本获取道具配置数据
|
||||
func _load_item_config_from_main():
|
||||
# 从主游戏脚本的全局变量获取道具配置数据
|
||||
if main_game.item_config_data.size() > 0:
|
||||
item_config = main_game.item_config_data
|
||||
print("道具商店:从主游戏脚本获取道具配置数据,道具种类:", item_config.size())
|
||||
else:
|
||||
print("道具商店:主游戏脚本中没有道具配置数据,使用空配置")
|
||||
item_config = {}
|
||||
|
||||
|
||||
# 商店道具点击处理 - 购买道具
|
||||
func _on_store_item_selected(item_name: String, item_cost: int, item_desc: String):
|
||||
# 检查玩家金钱是否足够(至少能买1个)
|
||||
if main_game.money < item_cost:
|
||||
Toast.show("金钱不足!需要 " + str(item_cost) + " 元,当前只有 " + str(main_game.money) + " 元", Color.RED, 3.0, 1.0)
|
||||
return
|
||||
|
||||
# 显示批量购买弹窗
|
||||
if batch_buy_popup:
|
||||
batch_buy_popup.show_buy_popup(
|
||||
item_name,
|
||||
item_cost,
|
||||
item_desc,
|
||||
"item",
|
||||
_on_confirm_buy_item,
|
||||
_on_cancel_buy_item
|
||||
)
|
||||
else:
|
||||
print("批量购买弹窗未找到")
|
||||
|
||||
# 显示购买确认对话框
|
||||
func _show_buy_confirmation_dialog(item_name: String, item_cost: int, item_desc: String):
|
||||
# 创建确认对话框
|
||||
var confirm_dialog = AcceptDialog.new()
|
||||
confirm_dialog.dialog_text = str(
|
||||
"确认购买道具?\n\n" +
|
||||
"道具名称: " + item_name + "\n" +
|
||||
"购买价格: " + str(item_cost) + " 元\n" +
|
||||
"道具描述: " + item_desc + "\n\n" +
|
||||
"当前金钱: " + str(main_game.money) + " 元\n" +
|
||||
"购买后余额: " + str(main_game.money - item_cost) + " 元"
|
||||
)
|
||||
confirm_dialog.title = "购买道具确认"
|
||||
confirm_dialog.ok_button_text = "确认购买"
|
||||
confirm_dialog.add_cancel_button("取消")
|
||||
|
||||
# 添加到场景
|
||||
add_child(confirm_dialog)
|
||||
|
||||
# 连接信号
|
||||
confirm_dialog.confirmed.connect(_on_confirm_buy_item.bind(item_name, item_cost, confirm_dialog))
|
||||
confirm_dialog.canceled.connect(_on_cancel_buy_item.bind(confirm_dialog))
|
||||
|
||||
# 显示对话框
|
||||
confirm_dialog.popup_centered()
|
||||
|
||||
# 确认购买道具(批量购买版本)
|
||||
func _on_confirm_buy_item(item_name: String, unit_cost: int, quantity: int, buy_type: String):
|
||||
var total_cost = unit_cost * quantity
|
||||
|
||||
# 再次检查金钱是否足够
|
||||
if main_game.money < total_cost:
|
||||
Toast.show("金钱不足!需要 " + str(total_cost) + " 元,当前只有 " + str(main_game.money) + " 元", Color.RED, 3.0, 1.0)
|
||||
return
|
||||
|
||||
# 发送批量购买请求到服务器
|
||||
_send_batch_buy_item_request(item_name, unit_cost, quantity)
|
||||
|
||||
# 取消购买道具(批量购买版本)
|
||||
func _on_cancel_buy_item():
|
||||
print("取消购买道具")
|
||||
|
||||
# 发送批量购买道具请求
|
||||
func _send_batch_buy_item_request(item_name: String, unit_cost: int, quantity: int):
|
||||
# 发送批量购买请求到服务器
|
||||
if tcp_network_manager_panel and tcp_network_manager_panel.has_method("sendBuyItem"):
|
||||
if tcp_network_manager_panel.sendBuyItem(item_name, unit_cost, quantity):
|
||||
# 服务器会处理批量购买逻辑,客户端等待响应
|
||||
print("已发送批量购买道具请求:", item_name, " 数量:", quantity)
|
||||
else:
|
||||
Toast.show("购买请求发送失败", Color.RED, 2.0, 1.0)
|
||||
else:
|
||||
Toast.show("网络管理器不可用", Color.RED, 2.0, 1.0)
|
||||
|
||||
# 将道具添加到道具背包(客户端同步)
|
||||
func _add_item_to_bag(item_name: String):
|
||||
# 确保道具背包存在
|
||||
if "道具背包" not in main_game:
|
||||
main_game["道具背包"] = []
|
||||
|
||||
# 查找是否已存在该道具
|
||||
var found = false
|
||||
for item in main_game["道具背包"]:
|
||||
if item.get("name") == item_name:
|
||||
item["count"] += 1
|
||||
found = true
|
||||
break
|
||||
|
||||
# 如果不存在,添加新道具
|
||||
if not found:
|
||||
main_game["道具背包"].append({
|
||||
"name": item_name,
|
||||
"count": 1
|
||||
})
|
||||
|
||||
# 更新按钮的道具图片
|
||||
func _update_button_item_image(button: Button, item_name: String):
|
||||
# 检查按钮是否有CropImage节点
|
||||
var item_image = button.get_node_or_null("CropImage")
|
||||
if not item_image:
|
||||
print("道具商店按钮没有找到CropImage节点:", button.name)
|
||||
return
|
||||
|
||||
# 从配置文件获取道具图片路径
|
||||
var texture = null
|
||||
|
||||
if item_config.has(item_name):
|
||||
var item_info = item_config[item_name]
|
||||
var image_path = item_info.get("道具图片", "")
|
||||
|
||||
if image_path != "" and ResourceLoader.exists(image_path):
|
||||
# 尝试加载道具图片
|
||||
texture = load(image_path)
|
||||
if texture:
|
||||
pass
|
||||
else:
|
||||
print("加载道具图片失败:", item_name, " -> ", image_path)
|
||||
else:
|
||||
print("道具图片路径无效或不存在:", item_name, " -> ", image_path)
|
||||
|
||||
# 如果没有找到道具图片,尝试使用默认道具图片
|
||||
if not texture:
|
||||
var default_item_path = "res://assets/道具图片/默认道具.webp"
|
||||
if ResourceLoader.exists(default_item_path):
|
||||
texture = load(default_item_path)
|
||||
if texture:
|
||||
print("使用默认道具图片:", item_name)
|
||||
|
||||
# 设置图片
|
||||
if texture:
|
||||
# CropImage是Sprite2D,直接设置texture属性
|
||||
item_image.texture = texture
|
||||
item_image.visible = true
|
||||
print("道具商店更新道具图片:", item_name)
|
||||
else:
|
||||
# 如果没有图片,隐藏图片节点
|
||||
item_image.visible = false
|
||||
print("道具商店无法获取道具图片:", item_name)
|
||||
|
||||
|
||||
#=========================面板通用处理=========================
|
||||
#手动刷新道具商店面板
|
||||
func _on_refresh_button_pressed() -> void:
|
||||
# 重新初始化道具商店
|
||||
init_item_store()
|
||||
Toast.show("道具商店已刷新", Color.GREEN, 2.0, 1.0)
|
||||
|
||||
|
||||
|
||||
# 关闭道具商店面板
|
||||
func _on_quit_button_pressed() -> void:
|
||||
self.hide()
|
||||
pass
|
||||
|
||||
|
||||
#面板显示与隐藏切换处理
|
||||
func _on_visibility_changed():
|
||||
if visible:
|
||||
GlobalVariables.isZoomDisabled = true
|
||||
# 面板显示时自动刷新数据
|
||||
init_item_store()
|
||||
pass
|
||||
else:
|
||||
GlobalVariables.isZoomDisabled = false
|
||||
pass
|
||||
#=========================面板通用处理=========================
|
||||
|
||||
|
||||
|
||||
#========================筛选功能============================
|
||||
# 当前筛选类型
|
||||
var current_filter_type: String = "全部"
|
||||
|
||||
#显示全部,既全部显示(默认)
|
||||
func _on_all_filter_pressed() -> void:
|
||||
current_filter_type = "全部"
|
||||
update_item_store_ui()
|
||||
Toast.show("显示全部道具", Color.GREEN, 2.0, 1.0)
|
||||
|
||||
#筛选宠物类型道具
|
||||
func _on_pet_filter_pressed() -> void:
|
||||
current_filter_type = "宠物道具"
|
||||
update_item_store_ui()
|
||||
Toast.show("筛选宠物道具", Color.GREEN, 2.0, 1.0)
|
||||
|
||||
#筛选作物类型道具
|
||||
func _on_crop_filter_pressed() -> void:
|
||||
current_filter_type = "作物道具"
|
||||
update_item_store_ui()
|
||||
Toast.show("筛选作物道具", Color.GREEN, 2.0, 1.0)
|
||||
|
||||
#筛选农场类型道具
|
||||
func _on_farm_filter_pressed() -> void:
|
||||
current_filter_type = "农场道具"
|
||||
update_item_store_ui()
|
||||
Toast.show("筛选农场道具", Color.GREEN, 2.0, 1.0)
|
||||
|
||||
# 检查道具是否符合当前筛选条件
|
||||
func _is_item_match_filter(item_name: String) -> bool:
|
||||
# 如果是显示全部,直接返回true
|
||||
if current_filter_type == "全部":
|
||||
return true
|
||||
|
||||
# 检查道具配置中的类型
|
||||
if item_config.has(item_name):
|
||||
var item_info = item_config[item_name]
|
||||
var item_type = item_info.get("类型", "")
|
||||
return item_type == current_filter_type
|
||||
|
||||
# 如果没有配置信息,默认不显示
|
||||
return false
|
||||
#========================筛选功能============================
|
||||
Reference in New Issue
Block a user