属性相关代码的优化
昨天太晚了,就没继续写,不过关于动画效果的部分也基本完结。接下来就要着手优化属性相关代码了。
这个属性代码我其实之前也简化过,整体逻辑已经很精简了,只是信号还没整理,所以这次的主要修改方向就是信号集中管理。
修改前:
# 更新玩家属性并处理点数变动
func _update_stat(stat_label, delta, property_name):
var stat_value = Player.get(property_name) # 动态获取当前属性值
if (stat_value > 0 or delta > 0) and (stat_value < 15 or delta < 0) and (Player.player_point > 0 or delta < 0):
Player.set(property_name, stat_value + delta) # 更新属性值
Player.player_point -= delta # 调整点数池
stat_label.text = str(Player.get(property_name)) # 更新属性值显示
update_points()
# 力量属性(str)
func _on_str_cut_pressed(): _update_stat(Grid.get_node("Str_Text"), -1, "player_str")
func _on_str_add_pressed(): _update_stat($ScrollContainer/VBoxContainer/StartMenu/RoleCreate/GridContainer2/Str_Text, 1, "player_str")
# 体质属性(con)
func _on_con_cut_pressed(): _update_stat($ScrollContainer/VBoxContainer/StartMenu/RoleCreate/GridContainer2/Con_Text, -1, "player_con")
func _on_con_add_pressed(): _update_stat($ScrollContainer/VBoxContainer/StartMenu/RoleCreate/GridContainer2/Con_Text, 1, "player_con")
# 灵巧属性(dex)
func _on_dex_cut_pressed(): _update_stat($ScrollContainer/VBoxContainer/StartMenu/RoleCreate/GridContainer2/Dex_Text, -1, "player_dex")
func _on_dex_add_pressed(): _update_stat($ScrollContainer/VBoxContainer/StartMenu/RoleCreate/GridContainer2/Dex_Text, 1, "player_dex")
# 智力属性(int)
func _on_int_cut_pressed(): _update_stat($ScrollContainer/VBoxContainer/StartMenu/RoleCreate/GridContainer2/Int_Text, -1, "player_int")
func _on_int_add_pressed(): _update_stat($ScrollContainer/VBoxContainer/StartMenu/RoleCreate/GridContainer2/Int_Text, 1, "player_int")
# 魅力属性(app)
func _on_app_cut_pressed(): _update_stat($ScrollContainer/VBoxContainer/StartMenu/RoleCreate/GridContainer2/App_Text, -1, "player_app")
func _on_app_add_pressed(): _update_stat($ScrollContainer/VBoxContainer/StartMenu/RoleCreate/GridContainer2/App_Text, 1, "player_app")
# 感知属性(awa)
func _on_awa_cut_pressed(): _update_stat($ScrollContainer/VBoxContainer/StartMenu/RoleCreate/GridContainer2/Awa_Text, -1, "player_awa")
func _on_awa_add_pressed(): _update_stat($ScrollContainer/VBoxContainer/StartMenu/RoleCreate/GridContainer2/Awa_Text, 1, "player_awa")
# 财富属性(gol)
func _on_gol_cut_pressed(): _update_stat($ScrollContainer/VBoxContainer/StartMenu/RoleCreate/GridContainer2/Gol_Text, -1, "player_gol")
func _on_gol_add_pressed(): _update_stat($ScrollContainer/VBoxContainer/StartMenu/RoleCreate/GridContainer2/Gol_Text, 1, "player_gol")新方案使用的是 .get_children() 来获取位于 ScrollContainer/.../RoleCreate/GridContainer2 下面的所有子节点,并为这些子节点中属于按钮类型的节点进行了信号连接,这样就能一口气把原本的那一长串信号全部给删掉了。
至于其他方面的简化……我懒得说,来来去去也就那几样,自己看注释吧。反正到目前为止,主菜单写的差不多了,设置和一些细节需要在完成游戏以后才能回来补充。所以接下来我会着手于设计游戏的正式内容,顺便做做数值规划。
修改后:
@onready var Grid2 = $ScrollContainer/VBoxContainer/StartMenu/RoleCreate/GridContainer2
func _ready:
var i = 0
for child in Grid2.get_children():
if child is Button:
child.pressed.connect(func(): _update_attribute(i))
i += 1
#定义一个数组,用来配合 .get() 获取位于另一个脚本中的参数,这里要注意:需要获取的是参数,而不是参数对应的值……修改参数对应的值只能改变局部变量,实际上对参数本身完全没改动。
var player_attribute_name = ["player_str", "player_con", "player_dex", "player_int", "player_app", "player_awa", "player_gol"]
func _update_attribute(index):
var names = player_attribute_name[index / 2] # 老方法,/2 来获取对应数据的名称。
var value = Player.get(names) # 根据获取到的名称来读取对应的值。
# 偶数减少属性,奇数增加属性。为了保证属性点在[0,15]范围内,还需要加上关于现在是增加还是减少的判断,不然属性为极限值时会卡死。
if (index % 2 == 0 and value > 0) or (index % 2 != 0 and value < 15 and Player.player_point > 0):
Player.set(names, value + (1 if index % 2 != 0 else -1)) # 三元运算符,如果 index % 2 != 0 成立,返回 1,否则返回 -1。
Player.player_point -= (1 if index % 2 != 0 else -1)
Grid2.get_node(names).text = str(Player.get(names))
update_points()本文作者:晝行燈
版权声明:本文采用 CC BY-NC 4.0 协议授权
转载需注明作者及原文链接: https://mansifield.pages.dev/llc6yz/