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

如何在Godot中使用C#检测AnimatedSprite2D的鼠标点击?

解决Godot中仅点击AnimatedSprite2D时停止动画的问题

你的代码目前只判断了鼠标左键释放事件,但没有检查点击位置是否落在AnimatedSprite2D的范围内,所以不管点击屏幕哪里都会触发动画停止。下面提供两种可行的解决方案:

方案一:直接在_Input中判断点击位置

修改你的_Input函数,添加点击位置的检测逻辑:

public override void _Input(InputEvent @event)
{
    // 仅处理鼠标左键释放事件
    if (@event is InputEventMouseButton mouseEvent && !mouseEvent.Pressed && mouseEvent.ButtonIndex == MouseButton.Left)
    {
        // 将鼠标全局坐标转换为当前节点的本地坐标
        Vector2 localMousePos = ToLocal(mouseEvent.GlobalPosition);
        // 检查点击位置是否在AnimatedSprite2D的范围内
        if (GetRect().HasPoint(localMousePos))
        {
            Stop();
        }
    }
}

关键说明:

  • 合并了重复的类型判断,简化代码逻辑
  • ToLocal用于将鼠标的全局位置转换为当前节点的本地坐标,适配节点的父级变换(比如缩放、旋转)
  • GetRect()获取AnimatedSprite2D的本地矩形范围,HasPoint判断坐标是否在该范围内

你也可以直接用全局坐标判断,效果一致:

if (GetGlobalRect().HasPoint(mouseEvent.GlobalPosition))
{
    Stop();
}

方案二:使用Area2D检测点击(更灵活)

如果你的动画帧有不同的碰撞区域,或者不想手动处理坐标转换,可以用Area2D来实现:

  1. 在AnimatedSprite2D节点下添加一个Area2D子节点
  2. 给Area2D添加CollisionShape2D,设置匹配AnimatedSprite2D大小的碰撞形状(比如RectangleShape2D)
  3. 在Area2D的Inspector面板中,将Monitorable设为true,Mouse Filter设为Stop
  4. 连接Area2D的input_event信号到AnimatedSprite2D的脚本
  5. 实现信号处理函数:
private void OnArea2DInputEvent(Node viewport, InputEvent @event, int shapeIdx)
{
    if (@event is InputEventMouseButton mouseEvent && !mouseEvent.Pressed && mouseEvent.ButtonIndex == MouseButton.Left)
    {
        Stop();
    }
}

关键说明:

  • Area2D会自动检测是否有输入事件落在其碰撞范围内,无需手动处理坐标
  • 若动画帧有不同的碰撞区域,可以在动画的AnimationPlayer中添加轨道,动态调整CollisionShape2D的形状

内容的提问来源于stack exchange,提问作者kaimaster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 10:15:14