281 lines
8.5 KiB
GDScript
281 lines
8.5 KiB
GDScript
extends Panel
|
||
# 这是道具背包面板,用来显示玩家获得的道具
|
||
|
||
# 道具背包格子容器
|
||
@onready var bag_grid: GridContainer = $ScrollContainer/Bag_Grid
|
||
@onready var quit_button : Button = $QuitButton
|
||
|
||
# 预添加常用的面板
|
||
@onready var main_game = get_node("/root/main")
|
||
@onready var network_manager = get_node("/root/main/UI/TCPNetworkManager")
|
||
|
||
# 道具使用状态
|
||
var selected_item_name: String = ""
|
||
var selected_item_button: Button = null
|
||
var is_item_selected: bool = false
|
||
|
||
# 准备函数
|
||
func _ready():
|
||
# 隐藏面板(初始默认隐藏)
|
||
self.hide()
|
||
|
||
# 初始化道具背包
|
||
func init_item_bag():
|
||
# 清空道具背包格子
|
||
for child in bag_grid.get_children():
|
||
child.queue_free()
|
||
|
||
# 显示背包中的道具
|
||
update_item_bag_ui()
|
||
|
||
# 更新道具背包UI
|
||
func update_item_bag_ui():
|
||
# 清空道具背包格子
|
||
for child in bag_grid.get_children():
|
||
child.queue_free()
|
||
|
||
print("更新道具背包UI,背包中道具数量:", main_game.item_bag.size())
|
||
|
||
# 为背包中的每个道具创建按钮
|
||
for item_data in main_game.item_bag:
|
||
var item_name = item_data["name"]
|
||
var item_count = item_data["count"]
|
||
|
||
# 创建道具按钮
|
||
var button = _create_item_button(item_name)
|
||
|
||
# 更新按钮文本显示数量
|
||
button.text = str(item_name + "\n数量:" + str(item_count))
|
||
|
||
# 根据是否处于访问模式连接不同的事件
|
||
if main_game.is_visiting_mode:
|
||
# 访问模式下,点击道具只显示信息,不能使用
|
||
button.pressed.connect(func(): _on_visit_item_selected(item_name, item_count))
|
||
else:
|
||
# 正常模式下,连接道具选择事件
|
||
button.pressed.connect(func(): _on_item_selected(item_name, item_count, button))
|
||
|
||
bag_grid.add_child(button)
|
||
|
||
# 创建道具按钮
|
||
func _create_item_button(item_name: 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
|
||
|
||
# 添加工具提示,从item_config.json获取道具信息
|
||
var item_config = _load_item_config()
|
||
if item_config and item_config.has(item_name):
|
||
var item_info = item_config[item_name]
|
||
var description = item_info.get("描述", "暂无描述")
|
||
var cost = item_info.get("花费", 0)
|
||
|
||
button.tooltip_text = str(
|
||
"道具: " + item_name + "\n" +
|
||
"价格: " + str(cost) + "元\n" +
|
||
"描述: " + description + "\n" +
|
||
"点击选择道具,然后对地块使用"
|
||
)
|
||
else:
|
||
button.tooltip_text = str("道具: " + item_name + "\n描述: 暂无信息")
|
||
|
||
# 如果按钮有标题标签,设置标题
|
||
if button.has_node("Title"):
|
||
button.get_node("Title").text = "道具"
|
||
button.get_node("Title").modulate = Color.CYAN # 道具标题使用青色
|
||
|
||
# 更新按钮的道具图片
|
||
_update_button_item_image(button, item_name)
|
||
|
||
return button
|
||
|
||
# 加载道具配置数据
|
||
func _load_item_config() -> Dictionary:
|
||
# 从item_config.json加载道具配置数据
|
||
var file = FileAccess.open("res://Server/config/item_config.json", FileAccess.READ)
|
||
if not file:
|
||
print("无法读取道具配置文件!")
|
||
return {}
|
||
|
||
var json_text = file.get_as_text()
|
||
file.close()
|
||
|
||
var json = JSON.new()
|
||
var parse_result = json.parse(json_text)
|
||
if parse_result != OK:
|
||
print("道具配置JSON解析错误:", json.get_error_message())
|
||
return {}
|
||
|
||
return json.get_data()
|
||
|
||
# 正常模式下的道具点击处理 - 选择道具
|
||
func _on_item_selected(item_name: String, item_count: int, button: Button):
|
||
# 检查道具是否可以使用
|
||
if not _is_item_usable(item_name):
|
||
# 显示道具信息
|
||
_show_item_info(item_name, item_count)
|
||
return
|
||
|
||
# 取消之前选择的道具
|
||
if selected_item_button and selected_item_button != button:
|
||
_deselect_item()
|
||
|
||
if selected_item_name == item_name:
|
||
# 如果点击的是已选择的道具,取消选择
|
||
_deselect_item()
|
||
Toast.show("已取消选择道具", Color.YELLOW, 2.0, 1.0)
|
||
else:
|
||
# 选择新道具
|
||
_select_item(item_name, button)
|
||
#点击后关闭玩家道具面板
|
||
_on_quit_button_pressed()
|
||
Toast.show("已选择 " + item_name + ",点击地块使用道具", Color.CYAN, 3.0, 1.0)
|
||
|
||
# 选择道具
|
||
func _select_item(item_name: String, button: Button):
|
||
selected_item_name = item_name
|
||
selected_item_button = button
|
||
is_item_selected = true
|
||
|
||
# 设置全局选择状态
|
||
main_game.selected_item_name = item_name
|
||
main_game.is_item_selected = true
|
||
|
||
# 更改按钮样式表示选中
|
||
if button.has_node("Title"):
|
||
button.get_node("Title").modulate = Color.YELLOW # 选中时使用黄色
|
||
|
||
# 取消选择道具
|
||
func _deselect_item():
|
||
selected_item_name = ""
|
||
is_item_selected = false
|
||
|
||
# 清除全局选择状态
|
||
main_game.selected_item_name = ""
|
||
main_game.is_item_selected = false
|
||
|
||
# 恢复按钮样式
|
||
if selected_item_button and selected_item_button.has_node("Title"):
|
||
selected_item_button.get_node("Title").modulate = Color.CYAN
|
||
|
||
selected_item_button = null
|
||
|
||
# 检查道具是否可以使用
|
||
func _is_item_usable(item_name: String) -> bool:
|
||
# 根据道具类型判断是否可以使用
|
||
match item_name:
|
||
"农家肥", "金坷垃", "生长素":
|
||
return true # 施肥道具
|
||
"水壶", "水桶":
|
||
return true # 浇水道具
|
||
"铲子":
|
||
return true # 铲除道具
|
||
"除草剂":
|
||
return true # 除草道具
|
||
"精准采集锄", "时运锄":
|
||
return true # 采集道具
|
||
"杀虫剂":
|
||
return false # 其他道具(暂不实现)
|
||
_:
|
||
return false
|
||
|
||
# 显示道具信息
|
||
func _show_item_info(item_name: String, item_count: int):
|
||
var info_text = ""
|
||
|
||
var item_config = _load_item_config()
|
||
if item_config and item_config.has(item_name):
|
||
var item_info = item_config[item_name]
|
||
var description = item_info.get("描述", "暂无描述")
|
||
var cost = item_info.get("花费", 0)
|
||
|
||
info_text = item_name + " (数量: " + str(item_count) + ")\n"
|
||
info_text += "价格: " + str(cost) + "元\n"
|
||
info_text += "描述: " + description
|
||
|
||
if not _is_item_usable(item_name):
|
||
info_text += "\n注意: 此道具功能暂未实现"
|
||
else:
|
||
info_text = item_name + " (数量: " + str(item_count) + ")\n描述: 暂无信息"
|
||
|
||
Toast.show(info_text, Color.CYAN, 3.0, 1.0)
|
||
|
||
# 访问模式下的道具点击处理
|
||
func _on_visit_item_selected(item_name: String, item_count: int):
|
||
# 显示道具信息
|
||
_show_item_info(item_name, item_count)
|
||
|
||
# 更新按钮的道具图片
|
||
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 item_config = _load_item_config()
|
||
var texture = null
|
||
|
||
if item_config and 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:
|
||
print("成功加载道具图片:", item_name, " -> ", image_path)
|
||
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_quit_button_pressed() -> void:
|
||
# 打开面板后暂时禁用相机功能
|
||
GlobalVariables.isZoomDisabled = false
|
||
self.hide()
|
||
|
||
#手动刷新道具背包面板
|
||
func _on_refresh_button_pressed() -> void:
|
||
# 刷新道具背包UI
|
||
update_item_bag_ui()
|
||
Toast.show("道具背包已刷新", Color.GREEN, 2.0, 1.0)
|
||
#=========================面板通用处理=========================
|
||
|
||
# 获取当前选择的道具名称
|
||
func get_selected_item_name() -> String:
|
||
return selected_item_name
|
||
|
||
# 检查是否有道具被选择
|
||
func is_item_currently_selected() -> bool:
|
||
return is_item_selected
|