Libgdx Box2D 创建实体
Libgdx Box2D create Bodies
在我的 libgdx tiles 2D jump 和 运行 游戏中,我想在我的大炮位置每秒创建一个身体,但就我而言,每秒只有一门大炮射击。
谁能帮我解决这个问题?
这是我创建大炮的地方:
//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();
}
这里我添加了canons(适用于每个位置):
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();
}
希望你能帮帮我!
你应该遍历所有的大炮并调用一些可以访问私有字段的方法bullets
,我称之为addBullet(Screen, float, float)
。你可能需要在 addBullet()
之前用 creator
做一些事情,因为我不确定你在用它做什么。
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 方法 class。
public void addBullet(Screen screen, float x, float y) {
bullets.add(new Bullet(screen, x, y));
}
据我所知,没有理由像您所做的那样每次都重新初始化项目符号数组。只需使用 pop();
或 removeIndex(index);
删除不再使用的数组项。您可以向 Cannon 添加更多方法 class
public void removeLastBullet() {
bullets.pop();
}
public void removeBullet(int i) {
bullets.removeIndex(i);
}
在我的 libgdx tiles 2D jump 和 运行 游戏中,我想在我的大炮位置每秒创建一个身体,但就我而言,每秒只有一门大炮射击。 谁能帮我解决这个问题?
这是我创建大炮的地方:
//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();
}
这里我添加了canons(适用于每个位置):
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();
}
希望你能帮帮我!
你应该遍历所有的大炮并调用一些可以访问私有字段的方法bullets
,我称之为addBullet(Screen, float, float)
。你可能需要在 addBullet()
之前用 creator
做一些事情,因为我不确定你在用它做什么。
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 方法 class。
public void addBullet(Screen screen, float x, float y) {
bullets.add(new Bullet(screen, x, y));
}
据我所知,没有理由像您所做的那样每次都重新初始化项目符号数组。只需使用 pop();
或 removeIndex(index);
删除不再使用的数组项。您可以向 Cannon 添加更多方法 class
public void removeLastBullet() {
bullets.pop();
}
public void removeBullet(int i) {
bullets.removeIndex(i);
}