You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GDScript中如何调用带InputEvent参数的事件函数?钓鱼机制开发求助

钓鱼机制实现问题:输入处理与代码优化

一、解决reel函数的触发问题

你的reel函数需要接收InputEventKey参数,无法直接在hook中调用——因为键盘输入事件由Godot引擎的输入系统统一传递,而非手动调用触发。正确的做法是通过_input函数捕获按键事件,配合状态标记来触发reel:

  1. 添加状态变量标记当前是否需要监听按键:
var is_hooking: bool = false  # 标记是否处于等待玩家按键的阶段
  1. 修改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  # 启动按键监听
  1. 添加_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:34:59