如何查询特定区域内的Box2D实体?

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

我想让所有Box2D实体都具有一定的半径。

对于afaik,我需要使用QueryCallback。我这样尝试:

private def getBodies(position: Vector2, radius: Float): LibgdxArray[Body] =
{
    val lowerBound = new Vector2(position - radius)
    val upperBound = new Vector2(position + radius)

    val bodies: LibgdxArray[Body] = new LibgdxArray[Body]

    val callback: QueryCallback = new QueryCallback
    {
        override def reportFixture(fixture: Fixture): Boolean =
        {
            bodies.add(fixture.getBody)
            true
        }
    }

    world.queryAABB(callback, lowerBound.x, lowerBound.y, upperBound.x, upperBound.y)

    bodies
}

我的问题是,我总是得到一个空的LibgdArray。除了在世界范围内致电queryAABB之外,我还需要做更多的事情吗?我的代码不正确吗?

edit:好的,我一点也不明白:我将半径设置为更大的值。我可以去除静态物体,但是动态物体根本不在乎:(

我这样添加它们:

if(Gdx.input.isButtonPressed(Buttons.RIGHT))
{
      val mousePos: Vector3 = new Vector3(Gdx.input.getX, Gdx.input.getY, 0)
      val worldPos = camera.unproject(mousePos)

  val ballShape: CircleShape = ShapeFactory.circle(new Vector2(worldPos.x, worldPos.y), 0.5f)
  val ballDef: BodyDef = new BodyDef
  ballDef.`type` = BodyType.DynamicBody
  val ballBody = world.createBody(ballDef)
  ballBody.createFixture(ballShape, 0.5f)

  ballShape.dispose
}
java scala libgdx box2d
1个回答
0
投票

潜在的解决方案

如果要查找给定区域内的所有对象,一种方法是先查找世界上最小的对象的大小,然后迭代测试该区域中从起点到终点的所有点(假设是矩形区域),并且迭代步骤等于找到的最小大小的一半(以避免意外跳过它们)。

示例代码:

查找最小面积的迭代步骤:

public static float smallestStep(World world) {
    //Start min size at max float value
    Vector2 minSize = Float.MAX_VALUE;
    //Gets bodies in world
    Array<Body> bodies = new Array<Body>();
    world.getBodies(bodies);

    //Iterate over every body
    for(Body body: bodies) {
        //Iterate over each fixture for each body
        for(Fixture fixture : body.getFixtureList()) {
            //Get fixture shape
            Shape shape = fixture.getShape();

            //Check if shape's "radius" is smaller than current min value
            if(shape.getRadius() < minSize) {
                //Updates min size
                minSize = shape.getRadius();
            }
        }
    }

    //Returns half of the min found value
    return minValue / 2;
}

[下一步是测试灯具是否包含给定点的方法,方法是遍历主体的所有灯具,如果使用fixture.testPoint()方法在主体的一个灯具包含该点,则将该主体添加到列表中,您应该能够生成与给定点重叠的所有物体的列表。

© www.soinside.com 2019 - 2024. All rights reserved.