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

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:使用输入映射(推荐)

  1. 打开Godot编辑器的项目设置→输入映射,添加新动作(比如命名为hide_sprite)
  2. 将W/A/S/D、上下左右键都绑定到这个动作上
  3. 代码中检测动作按下的瞬间:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:10:33