Godot(C#)实现按键触发永久隐藏Sprite的问题求助
你的代码问题出在每帧_PhysicsProcess都会先把Visible设为true——只要松开按键,下一次帧更新就会把Sprite恢复可见,自然无法实现永久隐藏。以下是几种解决方法:
方案1:用标志位控制状态
添加一个布尔变量记录是否已经隐藏,只在未隐藏时检测按键,一旦隐藏就不再修改Visible状态:
private bool _hasHiddenSprite = false; public override void _PhysicsProcess(float delta) { // 只有未隐藏时才检测按键 if (!_hasHiddenSprite) { bool hasMovementKeyPressed = Input.IsPhysicalKeyPressed((int)KeyList.W) || Input.IsPhysicalKeyPressed((int)KeyList.A) || Input.IsPhysicalKeyPressed((int)KeyList.S) || Input.IsPhysicalKeyPressed((int)KeyList.D) || Input.IsPhysicalKeyPressed((int)KeyList.Up) || Input.IsPhysicalKeyPressed((int)KeyList.Left) || Input.IsPhysicalKeyPressed((int)KeyList.Down) || Input.IsPhysicalKeyPressed((int)KeyList.Right); if (hasMovementKeyPressed) { Visible = false; _hasHiddenSprite = true; // 标记为已隐藏,后续不再处理 } } }
方案2:检测按键按下瞬间(更符合Godot开发习惯)
如果想只在按键按下的瞬间触发一次隐藏(而非持续按住也触发),可以用以下两种方式:
方式A:使用输入映射(推荐)
- 打开Godot编辑器的项目设置→输入映射,添加新动作(比如命名为
hide_sprite) - 将W/A/S/D、上下左右键都绑定到这个动作上
- 代码中检测动作按下的瞬间:
private bool _hasHiddenSprite = false; public override void _Process(float delta) { if (!_hasHiddenSprite && Input.IsActionJustPressed("hide_sprite")) { Visible = false; _hasHiddenSprite = true; } }
方式B:直接在_Input中检测按键事件
private bool _hasHiddenSprite = false; public override void _Input(InputEvent @event) { if (!_hasHiddenSprite && @event is InputEventKey keyEvent && keyEvent.Pressed) { KeyList pressedKey = keyEvent.Keycode; bool isMovementKey = pressedKey == KeyList.W || pressedKey == KeyList.A || pressedKey == KeyList.S || pressedKey == KeyList.D || pressedKey == KeyList.Up || pressedKey == KeyList.Left || pressedKey == KeyList.Down || pressedKey == KeyList.Right; if (isMovementKey) { Visible = false; _hasHiddenSprite = true; } } }
修改后,只要按下任意指定按键一次,Sprite就会永久隐藏,不会在松开后恢复。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

