GDScript中如何调用带InputEvent参数的事件函数?钓鱼机制开发求助
钓鱼机制实现问题:输入处理与代码优化
一、解决reel函数的触发问题
你的reel函数需要接收InputEventKey参数,无法直接在hook中调用——因为键盘输入事件由Godot引擎的输入系统统一传递,而非手动调用触发。正确的做法是通过_input函数捕获按键事件,配合状态标记来触发reel:
- 添加状态变量标记当前是否需要监听按键:
var is_hooking: bool = false # 标记是否处于等待玩家按键的阶段
- 修改
hook函数,开启监听状态:
func hook(): if fish <= 0 or fish >= 100: text = "fish dead" return cletter = letters.pick_random() text = cletter code = OS.find_keycode_from_string(cletter) is_hooking = true # 启动按键监听
- 添加
_input函数捕获按键事件,在合适时机调用reel:
func _input(event: InputEventKey): # 仅在监听状态且按键按下时处理 if is_hooking and event.is_pressed(): reel(event) is_hooking = false # 处理完成后关闭监听
二、代码实现的合理性优化
原代码存在一些可以优化的点,提升逻辑清晰度和健壮性:
- 生命值范围判断:原
fish > 0 && fish < 101应改为fish > 0 && fish <= 100,匹配初始值100的设定;同时在hook开头先判断生命值,避免无效流程。 - 消除重复代码:两处
await get_tree().create_timer(2).timeout逻辑重复,可抽成独立函数减少冗余:
func reset_hook(): await get_tree().create_timer(2).timeout hook()
- 过滤重复触发:添加
event.is_pressed()判断,确保只处理一次按键按下动作,避免重复触发逻辑。 - 变量初始化:给
cletter和code添加初始值,避免未初始化的潜在问题:
var cletter: String = "" var code: int = 0
优化后的完整代码
var letters: Array[String] = ["Q", "W", "E", "R"] var cletter: String = "" var fish: int = 100 var code: int = 0 var is_hooking: bool = false func reel(event:InputEventKey) : if fish <= 0 or fish >= 100: text = "fish dead" return if event.keycode == code: fish -= 10 text = "YAY " + str(fish) else: fish += 10 text = "NO " + str(fish) reset_hook() func reset_hook(): await get_tree().create_timer(2).timeout hook() func hook(): if fish <= 0 or fish >= 100: text = "fish dead" return cletter = letters.pick_random() text = cletter code = OS.find_keycode_from_string(cletter) is_hooking = true func _input(event: InputEventKey): if is_hooking and event.is_pressed(): reel(event) is_hooking = false
调整后即可实现预期流程:触发hook显示目标字母→玩家按下对应按键→reel判断对错并更新鱼的生命值→等待2秒后自动重置状态循环,直到鱼生命值耗尽。
内容的提问来源于stack exchange,提问作者Gelya
相关产品推荐
相关产品推荐

