如何在Godot 4.0中仅在窗口调整并释放鼠标左键后执行代码
在Godot 4.0中实现窗口调整完成后执行代码的方法
针对你需要在窗口调整完成(而非调整过程中)执行高开销方法的需求,这里提供两种可行方案:
方案一:定时器延迟检测(推荐,适配所有释放场景)
核心思路是:每次窗口尺寸变化时重启一个短定时器,只有当定时器正常跑完(说明一段时间内没有再调整窗口),才判定为调整完成并执行目标方法。这种方法不受鼠标释放位置(窗口内/外)的限制,可靠性更高。
实现步骤:
- 在主节点脚本中声明变量:
var _last_viewport_size: Vector2 var _resize_timer: Timer
- 初始化缓存尺寸并创建定时器:
func _ready(): _last_viewport_size = get_viewport().get_size() # 创建定时器,设置延迟时间(可根据需求调整,比如0.1~0.2秒) _resize_timer = Timer.new() _resize_timer.wait_time = 0.1 _resize_timer.one_shot = true # 绑定定时器超时信号到处理函数 _resize_timer.connect("timeout", Callable(self, "_on_resize_complete")) add_child(_resize_timer) # 绑定视口尺寸变化信号 get_viewport().connect("size_changed", Callable(self, "_on_viewport_size_changed"))
- 处理尺寸变化信号,重启定时器:
func _on_viewport_size_changed(): _last_viewport_size = get_viewport().get_size() _resize_timer.start() # 每次尺寸变化就重置定时器
- 定时器超时后执行高开销方法:
func _on_resize_complete(): # 额外验证尺寸是否稳定(避免定时器触发前又有尺寸变化) if get_viewport().get_size() == _last_viewport_size: # 替换为你的高开销方法 your_expensive_performance_method()
方案二:结合鼠标释放事件(仅适配鼠标在窗口内释放的场景)
如果你的场景中用户只会在窗口内释放鼠标,可以通过监听鼠标左键释放事件,结合尺寸变化标记来触发方法。但注意:若鼠标在窗口外释放,引擎无法检测到释放事件,此方法会失效。
实现步骤:
- 声明状态变量:
var _is_resizing: bool = false var _last_viewport_size: Vector2
- 绑定视口尺寸变化信号:
func _ready(): get_viewport().connect("size_changed", Callable(self, "_on_viewport_size_changed"))
- 标记调整状态:
func _on_viewport_size_changed(): _is_resizing = true _last_viewport_size = get_viewport().get_size()
- 监听鼠标释放事件并执行方法:
func _input(event: InputEvent): # 检测鼠标左键释放 if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and not event.pressed: if _is_resizing: # 延迟一帧确保尺寸稳定 call_deferred("_execute_expensive_method") _is_resizing = false func _execute_expensive_method(): if get_viewport().get_size() == _last_viewport_size: your_expensive_performance_method()
内容的提问来源于stack exchange,提问作者KanaszM
相关产品推荐
相关产品推荐

