Replace for-each loops with plain old C-style for loops

This commit is contained in:
2021-03-31 22:20:50 +02:00
parent 4f9a598d13
commit 453abfa037
3 changed files with 49 additions and 78 deletions

View File

@@ -10,9 +10,7 @@ import com.bartlomiejpluta.base.internal.render.ShaderManager;
import lombok.NonNull;
import org.joml.Vector2fc;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.ArrayList;
public abstract class BaseLayer implements Layer, Updatable {
@@ -22,9 +20,7 @@ public abstract class BaseLayer implements Layer, Updatable {
@NonNull
protected final Vector2fc stepSize;
protected final Queue<Animation> animations = new LinkedList<>();
private final List<Animation> animationsToAdd = new LinkedList<>();
protected final ArrayList<Animation> animations = new ArrayList<>();
public BaseLayer(@NonNull GameMap map) {
this.map = map;
@@ -33,7 +29,9 @@ public abstract class BaseLayer implements Layer, Updatable {
@Override
public void pushAnimation(Animation animation) {
animationsToAdd.add(animation);
animations.add(animation);
animation.setStepSize(stepSize.x(), stepSize.y());
animation.onAdd(this);
}
@Override
@@ -43,22 +41,18 @@ public abstract class BaseLayer implements Layer, Updatable {
@Override
public void update(float dt) {
if(!animationsToAdd.isEmpty()) {
for(var animation : animationsToAdd) {
animations.add(animation);
animation.setStepSize(stepSize.x(), stepSize.y());
animation.onAdd(this);
}
animationsToAdd.clear();
}
for (var iterator = animations.iterator(); iterator.hasNext(); ) {
var animation = iterator.next();
// Disclaimer
// For the sake of an easy adding and removing
// animations from the animation.update() method inside
// the loop, the loop itself has been implemented
// as plain old C-style for loop.
for (int i = 0; i < animations.size(); ++i) {
var animation = animations.get(i);
animation.update(dt);
if (animation.finished()) {
iterator.remove();
animations.remove(animation);
animation.onFinish(this);
}
}

View File

@@ -27,7 +27,7 @@ import static java.lang.Integer.compare;
public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
@Getter
private final List<Entity> entities;
private final ArrayList<Entity> entities = new ArrayList<>();
private final List<InteractiveEntity> interactiveEntities = new ArrayList<>();
@@ -38,35 +38,29 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
private final List<MovementRule> movementRules = new ArrayList<>();
private final List<Entity> entitiesToAdd = new LinkedList<>();
private final List<MovementRule> movementRulesToAdd = new LinkedList<>();
private final List<Entity> entitiesToRemove = new LinkedList<>();
private final List<MovementRule> movementRulesToRemove = new LinkedList<>();
private final int rows;
private final int columns;
public DefaultObjectLayer(@NonNull GameMap map, int rows, int columns, List<Entity> entities, PassageAbility[][] passageMap) {
public DefaultObjectLayer(@NonNull GameMap map, int rows, int columns, PassageAbility[][] passageMap) {
super(map);
this.rows = rows;
this.columns = columns;
this.entities = entities;
this.passageMap = passageMap;
}
@Override
public void registerMovementRule(MovementRule rule) {
movementRulesToAdd.add(rule);
movementRules.add(rule);
}
@Override
public void unregisterMovementRule(MovementRule rule) {
movementRulesToRemove.add(rule);
movementRules.remove(rule);
}
@Override
public void unregisterRules() {
movementRulesToRemove.addAll(movementRules);
movementRules.clear();
}
@Override
@@ -77,18 +71,30 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
layer.entities.remove(entity);
}
if (entity instanceof InteractiveEntity) {
interactiveEntities.add((InteractiveEntity) entity);
}
entity.setStepSize(stepSize.x(), stepSize.y());
entitiesToAdd.add(entity);
entities.add(entity);
entity.onAdd(this);
}
@Override
public void removeEntity(Entity entity) {
entitiesToRemove.add(entity);
entities.remove(entity);
if (entity instanceof InteractiveEntity) {
interactiveEntities.remove(entity);
}
entity.onRemove(this);
}
@Override
public void clearEntities() {
entitiesToRemove.addAll(entities);
entities.clear();
}
@Override
@@ -132,52 +138,12 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
movements.add(movement);
}
@SuppressWarnings("ForLoopReplaceableByForEach")
@Override
public void update(float dt) {
// Insert entities requested to be added
if (!entitiesToAdd.isEmpty()) {
for (var entity : entitiesToAdd) {
entity.onAdd(this);
if (entity instanceof InteractiveEntity) {
interactiveEntities.add((InteractiveEntity) entity);
}
entities.add(entity);
}
entitiesToAdd.clear();
}
// Insert rules requested to be added
if (!movementRulesToAdd.isEmpty()) {
movementRules.addAll(movementRulesToAdd);
movementRulesToAdd.clear();
}
// Remove entities requested to be removed
if (!entitiesToRemove.isEmpty()) {
for (var entity : entitiesToRemove) {
entities.remove(entity);
if (entity instanceof InteractiveEntity) {
interactiveEntities.remove(entity);
}
entity.onRemove(this);
}
entitiesToRemove.clear();
}
// Remove rules requested to be unregistered
if (!movementRulesToRemove.isEmpty()) {
movementRules.removeAll(movementRulesToRemove);
movementRulesToRemove.clear();
}
// Update BaseLayer (animations etc.)
super.update(dt);
// Update movements
while (!movements.isEmpty()) {
var movement = movements.poll();
var from = movement.getFrom();
@@ -185,7 +151,13 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
if (isTileReachable(to)) {
movement.perform();
for (var rule : movementRules) {
// Disclaimer
// For the sake of an easy adding and removing
// rules from the rule.update() method inside
// the loop, the loop itself has been implemented
// as plain old C-style for loop.
for (int i = 0; i < movementRules.size(); ++i) {
var rule = movementRules.get(i);
if (((from.equals(rule.from())) || (to.equals(rule.to())))) {
rule.invoke(movement);
}
@@ -193,8 +165,13 @@ public class DefaultObjectLayer extends BaseLayer implements ObjectLayer {
}
}
// Update entities
for (var entity : entities) {
// Disclaimer
// For the sake of an easy adding and removing
// entities from the entity.update() method inside
// the loop, the loop itself has been implemented
// as plain old C-style for loop.
for (int i = 0; i < entities.size(); ++i) {
var entity = entities.get(i);
entity.update(dt);
if (entity instanceof NPC) {

View File

@@ -130,7 +130,7 @@ public class DefaultGameMap implements Renderable, Updatable, GameMap {
Arrays.fill(passageMap[i], 0, columns, PassageAbility.ALLOW);
}
var layer = new DefaultObjectLayer(this, rows, columns, new ArrayList<>(), passageMap);
var layer = new DefaultObjectLayer(this, rows, columns, passageMap);
layers.add(layer);