首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检查哪一个Area2D与KinematicBody2D重叠?

如何检查哪一个Area2D与KinematicBody2D重叠?
EN

Game Development用户
提问于 2022-11-25 19:15:48
回答 1查看 102关注 0票数 1

我的播放器是KinematicBody2D,小时候有CollisionShape2D。

当玩家按下一个按钮时,我想检查他是否站在特定的(静态)区域。

这个区域是Area2D,孩子时有一个CollisionShape2D。

所以我想,我可以在我的球员课上做这样的事情:

代码语言:javascript
运行
复制
public override void _Process(float delta)
{
    

    if (Input.IsActionPressed("interact"))
    {
        //Check which areas are overlapping
    }
    
    //Do other stuff like moving
}

但不幸的是,我没有找到用KinematicBody2D实现这一目标的方法。

那么,是否有一种方法来询问哪一个Area2D与我的KinematicBody2D重叠?

EN

回答 1

Game Development用户

回答已采纳

发布于 2022-11-25 22:32:41

Area2Ds开始,这要容易得多,您可以用overlaps_body查询每个Area2D。就像这样:

代码语言:javascript
运行
复制
var areas := [$Area, $Area2] # perhaps get the list from somewhere else
for area in areas:
    if area.overlaps_body(self):
        print("Overlapping " + area.name)

另一方面,如果您没有对这些区域的引用,则必须执行一个物理查询,我相信这会是这样的:

代码语言:javascript
运行
复制
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#中的物理查询:

代码语言:javascript
运行
复制
        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");
            }
        }
票数 2
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/203462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档