前期代码优化(下)

属性相关代码的优化

昨天太晚了,就没继续写,不过关于动画效果的部分也基本完结。接下来就要着手优化属性相关代码了。

这个属性代码我其实之前也简化过,整体逻辑已经很精简了,只是信号还没整理,所以这次的主要修改方向就是信号集中管理。

修改前:
# 更新玩家属性并处理点数变动
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/