如何在Godot中检测Control节点碰撞以实现卡牌堆叠?
实现Control节点卡牌的堆叠与重叠检测
重叠检测核心方法:Control节点可通过
get_global_rect()获取自身在全局坐标系的矩形区域,拖拽结束时遍历其他卡牌Control节点,用Rect2.intersects()判断区域是否相交,这就是堆叠检测的基础。具体实现步骤:
- 给每个卡牌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 - 拖拽结束时执行重叠检测与堆叠逻辑:
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 # 只堆叠到第一个检测到的卡牌,可按需修改为多堆叠逻辑 - 提前将所有卡牌节点加入
cards分组,方便批量获取节点。
- 给每个卡牌Control节点绑定脚本,添加堆叠层级变量,拖拽时提升层级避免被遮挡:
优化建议:
- 增加重叠比例阈值,避免误触发:计算重叠区域面积占自身面积的比例,达到阈值再执行堆叠
var overlap_rect = my_global_rect.intersection(card.get_global_rect()) if overlap_rect.area / my_global_rect.area > 0.6: # 执行堆叠逻辑 - 加入堆叠拆分逻辑:比如点击卡牌时,将其从当前堆叠中移出,恢复独立位置与层级。
- 增加重叠比例阈值,避免误触发:计算重叠区域面积占自身面积的比例,达到阈值再执行堆叠
内容的提问来源于stack exchange,提问作者Nightinker
相关产品推荐
相关产品推荐

