From 84cdddc4b92dbba8ad877e4721f782a30d32c1c6 Mon Sep 17 00:00:00 2001 From: Matt Low Date: Thu, 22 Nov 2018 21:12:35 +0400 Subject: [PATCH] Write a CompositeIterator and use it to clean up entity iteration --- .../com/me/brickbuster/state/PlayState.java | 70 ++++++------------- .../brickbuster/utils/CompositeIterator.java | 43 ++++++++++++ 2 files changed, 66 insertions(+), 47 deletions(-) create mode 100644 core/src/com/me/brickbuster/utils/CompositeIterator.java diff --git a/core/src/com/me/brickbuster/state/PlayState.java b/core/src/com/me/brickbuster/state/PlayState.java index 9bfa66d..9b72113 100644 --- a/core/src/com/me/brickbuster/state/PlayState.java +++ b/core/src/com/me/brickbuster/state/PlayState.java @@ -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 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 it = balls.iterator(); it.hasNext();) { - Ball ball = it.next(); - ball.update(dt); - if (ball.isDeleted()) { + Iterator 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 it = powerUps.iterator(); it.hasNext();) { - PowerUp powerUp = it.next(); - powerUp.update(dt); - if(powerUp.isDeleted()) { - it.remove(); - world.destroyBody(powerUp.getBody()); - } - } - - for (Iterator it = shields.iterator(); it.hasNext();) { - Shield shield = it.next(); - shield.update(dt); - if(shield.isDeleted()) { - it.remove(); - world.destroyBody(shield.getBody()); - } - } - - for (Iterator 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; } diff --git a/core/src/com/me/brickbuster/utils/CompositeIterator.java b/core/src/com/me/brickbuster/utils/CompositeIterator.java new file mode 100644 index 0000000..2a30185 --- /dev/null +++ b/core/src/com/me/brickbuster/utils/CompositeIterator.java @@ -0,0 +1,43 @@ +package com.me.brickbuster.utils; + +import java.util.Iterator; + +public class CompositeIterator implements Iterator { + + private short index = 0; + private Iterator iterator; + private Iterable[] iterables; + + private CompositeIterator(Iterable... 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 CompositeIterator concat(Iterable... iterables) { + return new CompositeIterator(iterables); + } + +}