检测到碰撞后,如何检查帧中是否仍有某些物体处于碰撞形状2d(Godot)?

问题描述 投票:0回答:1

我正在制作一个乒乓球克隆。这是我在物体接触球时的代码:

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
    skew = randf_range(-90, 90)
    await get_tree().create_timer(0.15).timeout
    skew = 0
    Globalvariables.score += 1

如何检查球在下一帧中是否仍然接触球拍,以便我可以将其旋转 180 度(以避免它进入球拍内)?

我尝试使用一个变量来检查上一帧是否有东西接触到它,但这不起作用,因为 on_body_entered 函数仅在有东西开始接触它时才会触发。我也尝试做同样的事情,但也利用了 on_body_exited 函数。

collision-detection godot godot4
1个回答
0
投票

使用身体进入和身体存在应该可行,并且通常是一个很好的方法。

我还想提一下,如果你试图等待一个帧,你实际上可以等待一个图形帧:

await get_tree().process_frame

或者物理框架:

await get_tree().physics_frame

假设您使用的是

Area2D
(而不是也能够检测碰撞的
RigidBody2D
)。您也可以使用
overlaps_body

if overlaps_body(body):
    # something

或者类似,但更昂贵,你可以阅读

get_overlapping_bodies()
返回的内容并检查你想要的身体是否在那里:

if get_overlapping_bodies().has(body):
    # something

尝试一下。看看它是否适合你。


上述方法可能不够好,因为 Godot 缓存了最后一个物理步骤的值(因此,如果您在物理步骤期间调用它们,您将从之前的物理步骤中获取值)。

此外,你没有说

Area2D
,你说的是
CollisionShape2D
,并且一个
Area2D
或一个
PhysicsBody2D
(例如
RigidBody2D
)可以有多个
CollisionShape2D
...

如果您想要最新的检查,并且只想检查

CollisionShape2D
,我们需要使用较低级别的 API:

var query := PhysicsShapeQueryParameters2D.new()
query.shape = $CollisionShape2D.shape
query.transform = $CollisionShape2D.global_transform
var result := get_world_2d().direct_space_state.intersect_shape()

var overlapping := false
for entry in result:
    if entry["collider"] == body:
        overlapping = true
        break

if overlapping:
    # something 
© www.soinside.com 2019 - 2024. All rights reserved.