我正在制作一个乒乓球克隆。这是我在物体接触球时的代码:
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 函数。
使用身体进入和身体存在应该可行,并且通常是一个很好的方法。
我还想提一下,如果你试图等待一个帧,你实际上可以等待一个图形帧:
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