我的播放器是KinematicBody2D,小时候有CollisionShape2D。
当玩家按下一个按钮时,我想检查他是否站在特定的(静态)区域。
这个区域是Area2D,孩子时有一个CollisionShape2D。
所以我想,我可以在我的球员课上做这样的事情:
public override void _Process(float delta)
{
if (Input.IsActionPressed("interact"))
{
//Check which areas are overlapping
}
//Do other stuff like moving
}
但不幸的是,我没有找到用KinematicBody2D实现这一目标的方法。
那么,是否有一种方法来询问哪一个Area2D与我的KinematicBody2D重叠?
发布于 2022-11-25 22:32:41
从Area2D
s开始,这要容易得多,您可以用overlaps_body
查询每个Area2D
。就像这样:
var areas := [$Area, $Area2] # perhaps get the list from somewhere else
for area in areas:
if area.overlaps_body(self):
print("Overlapping " + area.name)
另一方面,如果您没有对这些区域的引用,则必须执行一个物理查询,我相信这会是这样的:
var space := get_world_2d().direct_space_state
var query := Physics2DShapeQueryParameters.new()
query.collide_with_areas = true
query.collide_with_bodies = false
query.set_shape($CollisionShape2D.shape)
query.transform = $CollisionShape2D.global_transform
var result := space.intersect_shape(query)
for area_collision in result:
var area := area_collision.collider as Area2D
if is_instance_valid(area): #perhaps some other checks here
print("Overlapping " + area.name)
这是C#中的物理查询:
var space = GetWorld2d().DirectSpaceState;
var query = new Physics2DShapeQueryParameters();
query.CollideWithAreas = true;
query.CollideWithBodies = false;
var collision = GetNode("CollisionShape2D");
query.SetShape(collision.Shape);
query.Transform = collision.GlobalTransform;
var result = space.IntersectShape(query);
foreach (Godot.Collections.Dictionary item in result)
{
GD.Print("All Dictionary: " + item.ToString());
var collider = item["collider"];
GD.Print("Found: " + collider.ToString());
GD.Print("Type: " + collider.GetType().ToString());
var area = collider as Area2D;
if (area!= null)
{
GD.Print("Some Random Area");
}
var treasure = collider as Treasure;
if (treasure != null)
{
GD.Print("Found some treasure");
}
}
https://gamedev.stackexchange.com/questions/203462
复制相似问题