使用Box2dbodies数组在不同时间创建多个相同的Body

时间:2018-07-18 08:28:32

标签: java arrays libgdx

我目前正在制作我的第一个libgdx游戏,但不确定在libgdx / box2d上下文中如何正确使用数组。我的目标是创建一组相同但在不同时间生成的box2dbobody。随着时间的推移,这样做会使游戏变得更困难。

我在网上寻找如何执行此操作的方法,最相关的搜索结果是用C ++编写的,它是关于同时生成一组100个尸体的。我使用转换器将其更改为Java,并更改了代码,以使其适合我的需求。我最终设法使其工作,但是现在我遇到了一个问题,我的一种方法实质上将对象以新的随机位置重新生成到屏幕的另一侧,但是不幸的是,我不知道如何将其应用于b2body刚刚创建的。

TLDR;我需要帮助修复我的数组代码以使Respawn()方法起作用,和/或完全重新整理我的数组以使其达到我的预期。任何帮助将不胜感激!

我的数组:

Shape[] objects = new PolygonShape[4];
Body[] bBody = new Body[4];

我如何定义我的身体:

private Body[] makeObstacle(World world, BodyDef.BodyType type, PolygonShape shape) {

    BodyDef bdef = new BodyDef();
    bdef.type = type;
    bdef.position.set(7, randomYPos);
    Body body = world.createBody(bdef);


    body.setLinearVelocity(-4, 0);

    shape = new PolygonShape();

    shape.setAsBox(60 / RadiationPigeon.PPM, 25 / RadiationPigeon.PPM);

    FixtureDef fdef = new FixtureDef();
    fdef.shape = shape;


    body.createFixture(fdef);


    return new Body[]{body}
}

这是我产生尸体的方式:

public void bodies(){

    if(!alreadyExecuted){

        if(DistanceM == 10 && DistanceC == 0) {
            bBody = makeObstacle(world, BodyDef.BodyType.KinematicBody, (PolygonShape) objects[2]);
            alreadyExecuted = true;
        }
    }

}

这是我的Respawn()方法:

private void Respawn(){
    if(bBody[2].getPosition().x <= -3){

        minWorldY = pigeoncam.position.y - pigeoncam.viewportHeight/2;
        maxWorldY = pigeoncam.position.y + pigeoncam.viewportHeight/2;
        randomYPos =  MathUtils.random(minWorldY, maxWorldY);
        bBody[2].setTransform(7, randomYPos, 0);

    }
}

使用上面的代码会给出有关respawn()方法的空对象引用错误

2 个答案:

答案 0 :(得分:0)

您的重生方法将调用imshow数组bBody中的第三个对象。我想象空指针是空数组的位置。尝试添加一个catch来检查对象是否为空,例如:

bBody[2]

如果控制台显示:“它不存在!”,则说明您尚未在该位置将主体放入数组中。从外观上看,您仅填充数组的第一位。

答案 1 :(得分:0)

由于缺乏对Java数组的了解,并且上面的主体代码来自一部分c ++代码;我的代码完全错误,在正确学习数组后,我设法通过以下方式对其进行了修复:

更改makeObstacle()方法以返回主体并摆脱“对象”数组:

private Body makeObstacle(World world, BodyDef.BodyType type) {

    BodyDef bdef = new BodyDef();
    bdef.type = type;
    bdef.position.set(7, randomYPos);
    Body body = world.createBody(bdef);


    body.setLinearVelocity(-4, 0);

    PolygonShape shape = new PolygonShape();

    shape.setAsBox(60 / RadiationPigeon.PPM, 25 / RadiationPigeon.PPM);

    FixtureDef fdef = new FixtureDef();
    fdef.shape = shape;


    body.createFixture(fdef);

    return body;
}

定义我要接收哪个bbody:

if(DistanceM == 10 && DistanceC == 0) {
            bBody[0] = makeObstacle(world, BodyDef.BodyType.KinematicBody);
            alreadyExecuted = true;
        }

让我的Respawn()方法检查所创建的bBody是否不为空

 private void Respawn(){
    if(bBody[0] != null && bBody[0].getPosition().x <= -3){

        minWorldY = pigeoncam.position.y - pigeoncam.viewportHeight/2;
        maxWorldY = pigeoncam.position.y + pigeoncam.viewportHeight/2;
        randomYPos =  MathUtils.random(minWorldY, maxWorldY);
        bBody[0].setTransform(7, randomYPos, 0);

    }
}