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

如何检测碰撞后下一帧物体是否仍处于CollisionShape2D内?

解决球陷入Paddle的碰撞检测问题

针对你遇到的球可能陷入Paddle的问题,推荐两种直接有效的检测方式:


方法一:在物理帧中持续检测重叠状态

利用Godot的物理帧回调_physics_process(),结合碰撞信号维护接触状态,实时判断球是否仍处于Paddle的碰撞范围内:

  1. 首先在球的脚本中添加变量标记接触状态:
var is_touching_paddle = false
var current_paddle = null
  1. 完善碰撞信号的回调函数:
func _on_body_entered(body):
    # 假设你的Paddle节点属于"paddle"分组,可根据实际情况调整判断逻辑
    if body.is_in_group("paddle"):
        is_touching_paddle = true
        current_paddle = body
        # 保留你原有的反弹、速度随机等逻辑
        rotation = -rotation
        speed = -speed
        if speed.x >= 0:
            speed.x = randf_range(0, large)
        else:
            speed.x = randf_range(-large, 0)
        if speed.y >= 0:
            speed.y = randf_range(0, large)
        else:
            speed.y = randf_range(-large, 0)
        var distance = position.distance_to(body.position)
        var x = true
        while x == true:
            if distance > 0:
                if distance > 90:
                    distance -= 90
                else:
                    x = false
            elif distance <= 0:
                if distance < -90:
                    distance += 90
                else:
                    x = false
        rotation_degrees += distance
        skew = randf_range(-90, 90)
        await get_tree().create_timer(0.15).timeout
        skew = 0
        Globalvariables.score += 1

func _on_body_exited(body):
    if body == current_paddle:
        is_touching_paddle = false
        current_paddle = null
  1. 在_physics_process(delta)中检测持续接触的情况:
func _physics_process(delta):
    if is_touching_paddle and current_paddle != null:
        # 检查当前是否仍与paddle重叠
        var overlapping_bodies = get_overlapping_bodies()
        if current_paddle in overlapping_bodies:
            # 球仍在paddle内,执行旋转180度并强制脱离
            rotation_degrees += 180
            speed = -speed
            # 额外添加微小位移,确保球脱离碰撞范围
            position += speed.normalized() * 5

方法二:碰撞触发后等待下一帧检测

如果只需要在碰撞发生后的下一帧检查,可以在_on_body_entered中等待物理帧后直接检测:

func _on_body_entered(body):
    # 先执行原有的反弹逻辑
    rotation = -rotation
    speed = -speed
    if speed.x >= 0:
        speed.x = randf_range(0, large)
    else:
        speed.x = randf_range(-large, 0)
    if speed.y >= 0:
        speed.y = randf_range(0, large)
    else:
        speed.y = randf_range(-large, 0)
    var distance = position.distance_to(body.position)
    var x = true
    while x == true:
        if distance > 0:
            if distance > 90:
                distance -= 90
            else:
                x = false
        elif distance <= 0:
            if distance < -90:
                distance += 90
            else:
                x = false
    rotation_degrees += distance
    
    # 等待下一物理帧
    await get_tree().physics_frame
    
    # 检查当前是否仍与该paddle重叠
    if body in get_overlapping_bodies():
        # 球仍在paddle内,旋转180度并调整速度
        rotation_degrees += 180
        speed = -speed
        # 强制位移脱离
        position += speed.normalized() * 3
    
    # 后续的skew和计分逻辑
    skew = randf_range(-90, 90)
    await get_tree().create_timer(0.15).timeout
    skew = 0
    Globalvariables.score += 1

注意事项:

  • 确保Paddle节点已正确设置碰撞层和掩码,与球的碰撞参数匹配,保证物理碰撞能被正常检测。
  • 可以根据实际游戏的碰撞体大小,调整位移的数值,确保球能完全脱离Paddle的碰撞范围。

内容的提问来源于stack exchange,提问作者P R Das

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:00:34