diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dde6c624..b0de6f0b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# Version 0.5.13 + +* only create animation states dynamically whenever they are required +* only compute tmx layer indices whenever they are required + # Version 0.5.12 * only create `AStarPathFinder` when it is actually used to reduce memory footprint diff --git a/core/src/main/java/de/bitbrain/braingdx/graphics/animation/AnimationRenderer.java b/core/src/main/java/de/bitbrain/braingdx/graphics/animation/AnimationRenderer.java index 28374caf8..1c3970a03 100644 --- a/core/src/main/java/de/bitbrain/braingdx/graphics/animation/AnimationRenderer.java +++ b/core/src/main/java/de/bitbrain/braingdx/graphics/animation/AnimationRenderer.java @@ -8,6 +8,7 @@ import com.badlogic.gdx.math.Vector2; import de.bitbrain.braingdx.graphics.GameObjectRenderManager; import de.bitbrain.braingdx.util.Enabler; +import de.bitbrain.braingdx.util.Factory; import de.bitbrain.braingdx.world.GameObject; /** @@ -42,6 +43,14 @@ private class AnimationState { public float stateTime; } + private final Factory animationStateFactory = new Factory() { + + @Override + public AnimationState create() { + return new AnimationState(); + } + }; + private final AnimationConfig config; private final AnimationCache animationCache; private final Sprite sprite; @@ -91,7 +100,7 @@ public AnimationRenderer offset(float x, float y) { private TextureRegion retrieveRegionFor(GameObject object, float delta) { Object currentAnimationType = animationTypeResolver.getAnimationType(object); - AnimationState state = (AnimationState) object.getOrSetAttribute(AnimationState.class, new AnimationState()); + AnimationState state = object.getOrSetAttribute(AnimationState.class, animationStateFactory); state.stateTime += delta; Animation animation = animationCache.getAnimation(currentAnimationType); boolean animationEnabled = animationEnabler.isEnabledFor(object); diff --git a/core/src/main/java/de/bitbrain/braingdx/tmx/GameObjectUpdater.java b/core/src/main/java/de/bitbrain/braingdx/tmx/GameObjectUpdater.java index 013c785e6..95d9a7fbc 100644 --- a/core/src/main/java/de/bitbrain/braingdx/tmx/GameObjectUpdater.java +++ b/core/src/main/java/de/bitbrain/braingdx/tmx/GameObjectUpdater.java @@ -21,6 +21,7 @@ import com.badlogic.gdx.math.Vector2; import de.bitbrain.braingdx.behavior.BehaviorAdapter; import de.bitbrain.braingdx.event.GameEventManager; +import de.bitbrain.braingdx.util.Factory; import de.bitbrain.braingdx.world.GameObject; /** @@ -32,6 +33,35 @@ */ class GameObjectUpdater extends BehaviorAdapter { + private class IndexFactory implements Factory { + + float value; + float cellSize; + + public IndexFactory() { + + } + + @Override + public Integer create() { + return IndexCalculator.calculateIndex(value, cellSize); + } + } + + private class LayerIndexFactory implements Factory { + + GameObject object; + + @Override + public Integer create() { + return api.lastLayerIndexOf(object); + } + } + + private final IndexFactory indexFactory = new IndexFactory(); + + private final LayerIndexFactory layerIndexFactory = new LayerIndexFactory(); + private final TiledMapAPI api; private final State state; @@ -81,13 +111,18 @@ private void updateCollision(GameObject object) { // and last position is not occupied Vector2 lastPosition = object.getLastPosition(); currentPosition.set(object.getLeft(), object.getTop()); - int lastLayerIndex = (Integer) object.getOrSetAttribute("lastLayerIndex", api.lastLayerIndexOf(object)); + layerIndexFactory.object = object; + int lastLayerIndex = object.getOrSetAttribute("lastLayerIndex", layerIndexFactory); int currentLayerIndex = api.layerIndexOf(object); if (lastLayerIndex != currentLayerIndex || !currentPosition.equals(lastPosition)) { Gdx.app.debug("TiledMapAPI", "Updating collision of " + object); // Object has moved, now check if last position is already occupied - int lastTileX = (Integer) object.getOrSetAttribute("lastTileX", IndexCalculator.calculateIndex(lastPosition.x, api.getCellWidth())); - int lastTileY = (Integer) object.getOrSetAttribute("lastTileY", IndexCalculator.calculateIndex(lastPosition.y, api.getCellHeight())); + indexFactory.value = lastPosition.x; + indexFactory.cellSize = api.getCellWidth(); + int lastTileX = object.getOrSetAttribute("lastTileX", indexFactory); + indexFactory.value = lastPosition.y; + indexFactory.cellSize = api.getCellHeight(); + int lastTileY = object.getOrSetAttribute("lastTileY", indexFactory); GameObject occupant = api.getGameObjectAt(lastTileX, lastTileY, lastLayerIndex); // clear last collision diff --git a/core/src/main/java/de/bitbrain/braingdx/util/Factory.java b/core/src/main/java/de/bitbrain/braingdx/util/Factory.java new file mode 100644 index 000000000..11fde62c6 --- /dev/null +++ b/core/src/main/java/de/bitbrain/braingdx/util/Factory.java @@ -0,0 +1,6 @@ +package de.bitbrain.braingdx.util; + +public interface Factory { + + T create(); +} diff --git a/core/src/main/java/de/bitbrain/braingdx/world/GameObject.java b/core/src/main/java/de/bitbrain/braingdx/world/GameObject.java index 7a8234345..2aa87c40d 100644 --- a/core/src/main/java/de/bitbrain/braingdx/world/GameObject.java +++ b/core/src/main/java/de/bitbrain/braingdx/world/GameObject.java @@ -19,6 +19,7 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Pool; +import de.bitbrain.braingdx.util.Factory; import de.bitbrain.braingdx.util.Mutator; import java.util.HashMap; @@ -269,13 +270,14 @@ public Object getAttribute(Object key) { return attributes.get(key); } - public Object getOrSetAttribute(Object key, Object defaultValue) { - Object value = attributes.get(key); + public T getOrSetAttribute(Object key, Factory defaultValueFactory) { + T value = (T) attributes.get(key); if (value != null) { return value; } - setAttribute(key, defaultValue); - return defaultValue; + value = defaultValueFactory.create(); + setAttribute(key, value); + return value; } public float getZIndex() {