我想让所有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
}
如果要查找给定区域内的所有对象,一种方法是先查找世界上最小的对象的大小,然后迭代测试该区域中从起点到终点的所有点(假设是矩形区域),并且迭代步骤等于找到的最小大小的一半(以避免意外跳过它们)。
查找最小面积的迭代步骤:
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()
方法在主体的一个灯具包含该点,则将该主体添加到列表中,您应该能够生成与给定点重叠的所有物体的列表。