优化项目架构
This commit is contained in:
294
SproutFarm-Frontend/Script/BigPanel/PetBagPanel.gd
Normal file
294
SproutFarm-Frontend/Script/BigPanel/PetBagPanel.gd
Normal file
@@ -0,0 +1,294 @@
|
||||
extends Panel
|
||||
# 这是宠物背包面板,用来显示玩家获得的宠物
|
||||
|
||||
# 宠物背包格子容器
|
||||
@onready var bag_grid: GridContainer = $ScrollContainer/Bag_Grid
|
||||
@onready var quit_button: Button = $QuitButton
|
||||
@onready var refresh_button: Button = $RefreshButton
|
||||
@onready var scroll_container = $ScrollContainer
|
||||
|
||||
# 预添加常用的面板
|
||||
@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_store_panel: Panel = $'../ItemStorePanel'
|
||||
@onready var pet_store_panel: Panel = $'../PetStorePanel'
|
||||
@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 pet_inform_panel: Panel = $'../../SmallPanel/PetInformPanel'
|
||||
|
||||
# 宠物配置数据
|
||||
var pet_config: Dictionary = {}
|
||||
|
||||
# 准备函数
|
||||
func _ready():
|
||||
# 连接关闭按钮信号
|
||||
quit_button.pressed.connect(self._on_quit_button_pressed)
|
||||
refresh_button.pressed.connect(self._on_refresh_button_pressed)
|
||||
# 连接可见性改变信号
|
||||
visibility_changed.connect(_on_visibility_changed)
|
||||
|
||||
# 隐藏面板(初始默认隐藏)
|
||||
self.hide()
|
||||
|
||||
# 初始化宠物背包
|
||||
func init_pet_bag():
|
||||
|
||||
# 显示背包中的宠物
|
||||
update_pet_bag_ui()
|
||||
|
||||
# 更新宠物背包UI(同步版本,用于刷新按钮)
|
||||
func update_pet_bag_ui():
|
||||
if scroll_container:
|
||||
scroll_container.clip_contents = false
|
||||
|
||||
# 设置GridContainer也不裁剪内容
|
||||
if bag_grid:
|
||||
bag_grid.clip_contents = false
|
||||
|
||||
# 清空宠物背包格子
|
||||
for child in bag_grid.get_children():
|
||||
child.queue_free()
|
||||
|
||||
# 确保宠物背包存在
|
||||
if not "pet_bag" in main_game or main_game.pet_bag == null:
|
||||
main_game.pet_bag = []
|
||||
|
||||
# 为背包中的每个宠物创建按钮
|
||||
for pet_data in main_game.pet_bag:
|
||||
var pet_name = pet_data.get("pet_type", "未知宠物")
|
||||
var pet_level = pet_data.get("pet_level", 1)
|
||||
var pet_owner_name = pet_data.get("pet_name", pet_name)
|
||||
|
||||
# 创建宠物按钮
|
||||
var button = _create_pet_button(pet_name, pet_level, pet_owner_name)
|
||||
|
||||
# 更新按钮文本显示宠物信息
|
||||
button.text = str(pet_owner_name + "\n等级:" + str(pet_level))
|
||||
|
||||
# 根据是否处于访问模式连接不同的事件
|
||||
if main_game.is_visiting_mode:
|
||||
# 访问模式下,点击宠物只显示信息
|
||||
button.pressed.connect(func(): _on_visit_pet_selected(pet_name, pet_data))
|
||||
else:
|
||||
# 正常模式下,连接宠物选择事件
|
||||
button.pressed.connect(func(): _on_pet_selected(pet_name, pet_data, button))
|
||||
|
||||
bag_grid.add_child(button)
|
||||
|
||||
# 创建宠物按钮
|
||||
func _create_pet_button(pet_name: String, pet_level: int, pet_owner_name: String) -> Button:
|
||||
# 使用按钮作为宠物背包按钮的样式
|
||||
var button = main_game.item_button.duplicate()
|
||||
|
||||
# 确保按钮可见并可点击
|
||||
button.visible = true
|
||||
button.disabled = false
|
||||
button.focus_mode = Control.FOCUS_ALL
|
||||
|
||||
# 关闭按钮的内容裁剪,允许图片超出按钮边界
|
||||
button.clip_contents = false
|
||||
|
||||
|
||||
# 添加工具提示
|
||||
button.tooltip_text = str(
|
||||
"宠物: " + pet_name + "\n" +
|
||||
"名称: " + pet_owner_name + "\n" +
|
||||
"等级: " + str(pet_level) + "\n" +
|
||||
"点击查看宠物详情"
|
||||
)
|
||||
|
||||
# 如果按钮有标题标签,设置标题
|
||||
if button.has_node("Title"):
|
||||
button.get_node("Title").text = "宠物"
|
||||
button.get_node("Title").modulate = Color.MAGENTA # 宠物标题使用洋红色
|
||||
|
||||
# 更新按钮的宠物图片
|
||||
_update_button_pet_image(button, pet_name)
|
||||
|
||||
return button
|
||||
|
||||
# 更新按钮的宠物图片
|
||||
func _update_button_pet_image(button: Button, pet_name: String):
|
||||
# 检查按钮是否有CropImage节点
|
||||
var pet_image = button.get_node_or_null("CropImage")
|
||||
if not pet_image:
|
||||
print("宠物背包按钮没有找到CropImage节点:", button.name)
|
||||
return
|
||||
|
||||
# 从服务器的宠物配置获取场景路径
|
||||
var texture = null
|
||||
var pet_config = main_game.pet_config # 使用服务器返回的宠物配置
|
||||
|
||||
if pet_config.has(pet_name):
|
||||
var pet_info = pet_config[pet_name]
|
||||
var scene_path = pet_info.get("pet_image", "") # 使用服务器数据的pet_image字段
|
||||
print("宠物背包 ", pet_name, " 的图片路径:", scene_path)
|
||||
|
||||
if scene_path != "" and ResourceLoader.exists(scene_path):
|
||||
print("宠物背包开始加载宠物场景:", scene_path)
|
||||
# 加载宠物场景并获取PetImage的纹理
|
||||
var pet_scene = load(scene_path)
|
||||
if pet_scene:
|
||||
var pet_instance = pet_scene.instantiate()
|
||||
# 直接使用实例化的场景根节点,因为根节点就是PetImage
|
||||
if pet_instance and pet_instance.sprite_frames:
|
||||
# 获取默认动画的第一帧
|
||||
var animation_names = pet_instance.sprite_frames.get_animation_names()
|
||||
if animation_names.size() > 0:
|
||||
var default_animation = animation_names[0]
|
||||
var frame_count = pet_instance.sprite_frames.get_frame_count(default_animation)
|
||||
if frame_count > 0:
|
||||
texture = pet_instance.sprite_frames.get_frame_texture(default_animation, 0)
|
||||
print("宠物背包成功获取宠物纹理:", pet_name)
|
||||
else:
|
||||
print("宠物背包场景没有动画:", pet_name)
|
||||
else:
|
||||
print("宠物背包场景没有PetImage节点或sprite_frames:", pet_name)
|
||||
pet_instance.queue_free()
|
||||
else:
|
||||
print("宠物背包无法加载宠物场景:", scene_path)
|
||||
else:
|
||||
print("宠物背包图片路径无效或文件不存在:", scene_path)
|
||||
else:
|
||||
print("宠物背包配置中没有找到:", pet_name)
|
||||
|
||||
# 设置图片
|
||||
if texture:
|
||||
pet_image.texture = texture
|
||||
pet_image.visible = true
|
||||
pet_image.scale = Vector2(10, 10)
|
||||
# 确保图片居中显示
|
||||
pet_image.centered = true
|
||||
print("宠物背包成功设置宠物图片:", pet_name)
|
||||
else:
|
||||
pet_image.visible = false
|
||||
print("宠物背包无法获取宠物图片:", pet_name)
|
||||
|
||||
# 加载宠物配置数据
|
||||
func _load_pet_config() -> Dictionary:
|
||||
var file = FileAccess.open("res://Data/pet_data.json", FileAccess.READ)
|
||||
if file == null:
|
||||
return {}
|
||||
|
||||
var json = JSON.new()
|
||||
var json_string = file.get_as_text()
|
||||
file.close()
|
||||
|
||||
var parse_result = json.parse(json_string)
|
||||
if parse_result != OK:
|
||||
return {}
|
||||
|
||||
return json.data
|
||||
|
||||
# 计算宠物年龄(以天为单位)
|
||||
func _calculate_pet_age(birthday: String) -> int:
|
||||
if birthday == "":
|
||||
return 0
|
||||
|
||||
# 解析生日字符串,格式:2025年7月5日10时7分25秒
|
||||
var birthday_parts = birthday.split("年")
|
||||
if birthday_parts.size() < 2:
|
||||
return 0
|
||||
|
||||
var year = int(birthday_parts[0])
|
||||
var rest = birthday_parts[1]
|
||||
|
||||
var month_parts = rest.split("月")
|
||||
if month_parts.size() < 2:
|
||||
return 0
|
||||
|
||||
var month = int(month_parts[0])
|
||||
var rest2 = month_parts[1]
|
||||
|
||||
var day_parts = rest2.split("日")
|
||||
if day_parts.size() < 2:
|
||||
return 0
|
||||
|
||||
var day = int(day_parts[0])
|
||||
var rest3 = day_parts[1]
|
||||
|
||||
var hour_parts = rest3.split("时")
|
||||
if hour_parts.size() < 2:
|
||||
return 0
|
||||
|
||||
var hour = int(hour_parts[0])
|
||||
var rest4 = hour_parts[1]
|
||||
|
||||
var minute_parts = rest4.split("分")
|
||||
if minute_parts.size() < 2:
|
||||
return 0
|
||||
|
||||
var minute = int(minute_parts[0])
|
||||
var rest5 = minute_parts[1]
|
||||
|
||||
var second_parts = rest5.split("秒")
|
||||
if second_parts.size() < 1:
|
||||
return 0
|
||||
|
||||
var second = int(second_parts[0])
|
||||
|
||||
# 将生日转换为Unix时间戳
|
||||
var birthday_dict = {
|
||||
"year": year,
|
||||
"month": month,
|
||||
"day": day,
|
||||
"hour": hour,
|
||||
"minute": minute,
|
||||
"second": second
|
||||
}
|
||||
|
||||
var birthday_timestamp = Time.get_unix_time_from_datetime_dict(birthday_dict)
|
||||
var current_timestamp = Time.get_unix_time_from_system()
|
||||
|
||||
# 计算天数差
|
||||
var age_seconds = current_timestamp - birthday_timestamp
|
||||
var age_days = int(age_seconds / (24 * 3600))
|
||||
|
||||
return max(0, age_days)
|
||||
|
||||
|
||||
# 正常模式下的宠物点击处理 - 查看宠物信息
|
||||
func _on_pet_selected(pet_name: String, pet_data: Dictionary, button: Button):
|
||||
# 显示宠物信息面板
|
||||
if pet_inform_panel:
|
||||
pet_inform_panel.show_pet_info(pet_name, pet_data)
|
||||
pet_inform_panel.show()
|
||||
|
||||
|
||||
# 访问模式下的宠物点击处理
|
||||
func _on_visit_pet_selected(pet_name: String, pet_data: Dictionary):
|
||||
# 显示宠物信息面板
|
||||
if pet_inform_panel:
|
||||
pet_inform_panel.show_pet_info(pet_name, pet_data)
|
||||
pet_inform_panel.show()
|
||||
|
||||
#=========================面板通用处理=========================
|
||||
# 关闭宠物背包面板
|
||||
func _on_quit_button_pressed() -> void:
|
||||
self.hide()
|
||||
|
||||
# 手动刷新宠物背包面板
|
||||
func _on_refresh_button_pressed() -> void:
|
||||
# 刷新宠物背包UI
|
||||
update_pet_bag_ui()
|
||||
Toast.show("宠物背包已刷新", Color.GREEN, 2.0, 1.0)
|
||||
|
||||
#面板显示与隐藏切换处理
|
||||
func _on_visibility_changed():
|
||||
if visible:
|
||||
GlobalVariables.isZoomDisabled = true
|
||||
# 面板显示时请求同步最新的背包数据
|
||||
tcp_network_manager_panel.send_sync_bag_data_request()
|
||||
# 面板显示时自动刷新数据
|
||||
update_pet_bag_ui()
|
||||
pass
|
||||
else:
|
||||
GlobalVariables.isZoomDisabled = false
|
||||
pass
|
||||
#=========================面板通用处理=========================
|
||||
Reference in New Issue
Block a user