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

如何在Godot中检测Control节点碰撞以实现卡牌堆叠?

实现Control节点卡牌的堆叠与重叠检测
  • 重叠检测核心方法:Control节点可通过get_global_rect()获取自身在全局坐标系的矩形区域,拖拽结束时遍历其他卡牌Control节点,用Rect2.intersects()判断区域是否相交,这就是堆叠检测的基础。

  • 具体实现步骤:

    1. 给每个卡牌Control节点绑定脚本,添加堆叠层级变量,拖拽时提升层级避免被遮挡:
      var stack_layer = 0
      
      func _on_drag_started():
          # 获取所有卡牌中的最高层级,当前卡牌层级+1
          stack_layer = get_tree().get_nodes_in_group("cards").max(func(c): c.stack_layer) + 1
          z_index = stack_layer
      
    2. 拖拽结束时执行重叠检测与堆叠逻辑:
      func _on_drag_ended(position, canceled):
          if canceled:
              return
          var my_global_rect = get_global_rect()
          # 遍历所有卡牌节点
          for card in get_tree().get_nodes_in_group("cards"):
              if card == self:
                  continue
              if my_global_rect.intersects(card.get_global_rect()):
                  # 设置堆叠偏移,避免卡牌完全重合
                  var stack_offset = Vector2(12, 12)
                  global_position = card.global_position + stack_offset
                  stack_layer = card.stack_layer + 1
                  z_index = stack_layer
                  # 可选:将当前卡牌设为目标卡牌的子节点,方便管理堆叠关系
                  # reparent(card)
                  break # 只堆叠到第一个检测到的卡牌,可按需修改为多堆叠逻辑
      
    3. 提前将所有卡牌节点加入cards分组,方便批量获取节点。
  • 优化建议:

    • 增加重叠比例阈值,避免误触发:计算重叠区域面积占自身面积的比例,达到阈值再执行堆叠
      var overlap_rect = my_global_rect.intersection(card.get_global_rect())
       if overlap_rect.area / my_global_rect.area > 0.6:
           # 执行堆叠逻辑
      
    • 加入堆叠拆分逻辑:比如点击卡牌时,将其从当前堆叠中移出,恢复独立位置与层级。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 01:27:05