Libgdx Box2D创建机构

时间:2015-11-28 12:31:35

标签: libgdx box2d tiled

在我的libgdx瓷砖2D跳跃和跑步游戏我想在我的大炮的位置每秒创建一个身体,但就我而言,每秒只有一个大炮射击。 任何人都可以帮我解决这个问题吗?

继承我制造大炮的地方:

//create cannon bodies/fixtures
    cannons = new Array<Cannon>();
    for (MapObject object : map.getLayers().get(5).getObjects().getByType(RectangleMapObject.class)) {
        recta = ((RectangleMapObject) object).getRectangle();
        cannons.add(new Cannon(screen, recta.getX(), recta.getY()));
    }

}

    public float X() {
        return recta.getX();
    }

    public float Y() {
        return recta.getY();
    }

在这里我添加了一些教规(适用于每个职位):

private Array<Bullet> bullets;

public Cannon(PlayScreen screen, float x, float y) {
    super(screen, x, y);
    setBounds(getX(), getY(), getWidth(), getHeight());
}

public Cannon() {
    super();
}

@Override
protected void defineTrap() {
    b2body = Body.addStatic(b2body, world, 0f, getX(), getY(), 32, x.CANNON_BIT, "cannon");
    createBullet();
}

public void createBullet() {
    bullets = new Array<Bullet>();
    bullets.add(new Bullet(screen, getX(), getY()));
}

在这里,我添加了第一颗子弹(也适用于所有大炮):

public Bullet(PlayScreen screen, float x, float y) {
    super(screen, x, y);
    setBounds(getX(), getY(), getWidth(), getHeight());
}

public Bullet() {

}

@Override
public void defineTrap() {
    b2body = Body.addDynamic(b2body, world, 0f, getX(), getY(), 8, x.BULLET_BIT, "bullet");
    b2body.setLinearVelocity(new Vector2(-1f, 0));
    b2body.setGravityScale(0);
}

在这里,我希望每个大炮都能射击,但只有一个能射击(它是我的渲染方法):

if (TimeUtils.timeSinceNanos(startTime) > 1000000000) {
        bullets = new Array<Bullet>();
        bullets.add(new Bullet(this, creator.X(), creator.Y()));
        startTime = TimeUtils.nanoTime();
    }

我希望你能帮助我!

1 个答案:

答案 0 :(得分:1)

你应该遍历所有大炮并调用一些可以访问私有字段bullets的方法,我称之为addBullet(Screen, float, float)。您可能需要在creator之前使用addBullet()执行某些操作,因为我不确定您在使用它做了什么。

if (TimeUtils.timeSinceNanos(startTime) > 1000000000) {
    for(int i = 0; i < Cannons.size; i++) {
        Cannon cannon = cannons.get(i);
        cannon.addBullet(this, creator.X(), creator.Y());
    }
    startTime = TimeUtils.nanoTime();
}

然后在Cannon类中创建addBullet方法。

public void addBullet(Screen screen, float x, float y) {
    bullets.add(new Bullet(screen, x, y));
}

据我所知,没有理由每次都像你一样重新初始化子弹阵列。只需使用pop();removeIndex(index);删除不再使用的数组项。您可以向Cannon类添加更多方法

public void removeLastBullet() {
    bullets.pop();
}

public void removeBullet(int i) {
    bullets.removeIndex(i);
}