Write a CompositeIterator and use it to clean up entity iteration

This commit is contained in:
Matt Low 2018-11-22 21:12:35 +04:00
parent 4d27a2671a
commit 84cdddc4b9
2 changed files with 66 additions and 47 deletions

View File

@ -2,17 +2,20 @@ package com.me.brickbuster.state;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.*;
import com.badlogic.gdx.utils.Array;
import com.me.brickbuster.BrickBuster;
import com.me.brickbuster.utils.CompositeIterator;
import com.me.brickbuster.entity.*;
import com.me.brickbuster.entity.powerup.PowerUp;
import com.me.brickbuster.layout.*;
import com.me.brickbuster.layout.BrickLayout;
import com.me.brickbuster.layout.FileLevelLoader;
import com.me.brickbuster.layout.Level;
import com.me.brickbuster.layout.LevelLoader;
import com.me.brickbuster.physics.Box2dContactListener;
import com.me.brickbuster.physics.EntityType;
import com.me.brickbuster.physics.PhysicsBody;
import java.util.Iterator;
@ -81,25 +84,20 @@ public class PlayState extends FieldState {
long start = System.nanoTime();
game.sb.begin();
for (Brick block : bricks) {
block.render(game.sb, game.sr);
}
for (Ball ball : balls) {
ball.render(game.sb, game.sr);
Iterator<? extends Entity> it = CompositeIterator.concat(balls, bricks);
while (it.hasNext()) {
it.next().render(game.sb, game.sr);
}
game.sb.end();
for (PowerUp powerUp : powerUps) {
powerUp.render(game.sb, game.sr);
}
for (Shield shield : shields) {
shield.render(game.sb, game.sr);
it = CompositeIterator.concat(powerUps, shields);
while (it.hasNext()) {
it.next().render(game.sb, game.sr);
}
paddle.render(game.sb, game.sr);
//debugRenderer.render(world, game.cam.combined.cpy().scl(PIXEL_PER_METER));
long renderTime = System.nanoTime() - start;
game.fb.begin();
game.font.setColor(Color.GRAY);
game.font.draw(game.fb, String.format("FPS: %d Update: %.2f ms Render: %.2f ms",
@ -110,47 +108,26 @@ public class PlayState extends FieldState {
@Override
public void update(float dt) {
long start = System.nanoTime();
paddle.update(dt);
for (Iterator<Ball> it = balls.iterator(); it.hasNext();) {
Ball ball = it.next();
ball.update(dt);
if (ball.isDeleted()) {
Iterator<? extends Entity> it = CompositeIterator.concat(balls, powerUps, shields, bricks);
while (it.hasNext()) {
Entity ent = it.next();
ent.update(dt);
if (ent.isDeleted()) {
it.remove();
world.destroyBody(ball.getBody());
if (ent instanceof PhysicsBody) {
world.destroyBody(((PhysicsBody) ent).getBody());
}
ent.dispose();
}
}
if (balls.size == 0) {
ballReset();
}
for (Iterator<PowerUp> it = powerUps.iterator(); it.hasNext();) {
PowerUp powerUp = it.next();
powerUp.update(dt);
if(powerUp.isDeleted()) {
it.remove();
world.destroyBody(powerUp.getBody());
}
}
for (Iterator<Shield> it = shields.iterator(); it.hasNext();) {
Shield shield = it.next();
shield.update(dt);
if(shield.isDeleted()) {
it.remove();
world.destroyBody(shield.getBody());
}
}
for (Iterator<Brick> it = bricks.iterator(); it.hasNext();) {
Brick brick = it.next();
brick.update(dt);
if (brick.isDeleted()) {
it.remove();
brick.dispose();
world.destroyBody(brick.getBody());
}
}
if (bricks.size == 0) {
currentLevel = levelLoader.getNextLevel();
if (currentLevel == null) {
@ -161,7 +138,6 @@ public class PlayState extends FieldState {
}
return;
}
world.step(dt, 6, 2);
updateTime = System.nanoTime() - start;
}

View File

@ -0,0 +1,43 @@
package com.me.brickbuster.utils;
import java.util.Iterator;
public class CompositeIterator<T> implements Iterator<T> {
private short index = 0;
private Iterator<? extends T> iterator;
private Iterable<? extends T>[] iterables;
private CompositeIterator(Iterable<? extends T>... iterables) {
this.iterables = iterables;
this.iterator = iterables[index].iterator();
}
@Override
public boolean hasNext() {
if (iterator.hasNext()) {
return true;
} else {
if (++index < iterables.length) {
iterator = iterables[index].iterator();
return hasNext();
}
}
return false;
}
@Override
public T next() {
return iterator.next();
}
@Override
public void remove() {
iterator.remove();
}
public static <E> CompositeIterator<E> concat(Iterable<? extends E>... iterables) {
return new CompositeIterator<E>(iterables);
}
}