From f21568520779d86ddf86c54fbe1faf70fc3fb1c5 Mon Sep 17 00:00:00 2001 From: Florian Minjat Date: Wed, 10 Apr 2013 18:12:36 +0200 Subject: [PATCH] Modifiers improved to be able to use them in more general pools : - reset methods taking a IEaseFunction as parameter added in BaseDoubleValueSpanModifier and BaseSingleValueSpanModifier classes - IModifier.clearModifierListeners method added to able to clear all modifier listeners when the modifier goes back in the pool - IModifier.onUnregister event method added to be able to recycle the modifier back to the pool easily - ModifierList.clear, remove and onUpdate method overridden from super class to call onUnregister event on modifiers --- .../modifier/BaseDoubleValueSpanModifier.java | 8 +++++-- .../andengine/util/modifier/BaseModifier.java | 9 ++++++++ .../modifier/BaseSingleValueSpanModifier.java | 14 +++++++++++-- .../andengine/util/modifier/IModifier.java | 3 +++ .../andengine/util/modifier/ModifierList.java | 21 +++++++++++++++++++ 5 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/org/andengine/util/modifier/BaseDoubleValueSpanModifier.java b/src/org/andengine/util/modifier/BaseDoubleValueSpanModifier.java index 4db6a6811..cba778eca 100644 --- a/src/org/andengine/util/modifier/BaseDoubleValueSpanModifier.java +++ b/src/org/andengine/util/modifier/BaseDoubleValueSpanModifier.java @@ -111,9 +111,13 @@ public void reset(final float pDuration, final float pFromValue, final float pTo // =========================================================== // Methods // =========================================================== - + public void reset(final float pDuration, final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB) { - super.reset(pDuration, pFromValueA, pToValueA); + reset(pDuration, pFromValueA, pToValueA, pFromValueB, pToValueB, mEaseFunction); + } + + public void reset(final float pDuration, final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB, final IEaseFunction pEaseFunction) { + super.reset(pDuration, pFromValueA, pToValueA, pEaseFunction); this.mFromValueB = pFromValueB; this.mValueSpanB = pToValueB - pFromValueB; diff --git a/src/org/andengine/util/modifier/BaseModifier.java b/src/org/andengine/util/modifier/BaseModifier.java index 4ea40ab74..1b9a03855 100644 --- a/src/org/andengine/util/modifier/BaseModifier.java +++ b/src/org/andengine/util/modifier/BaseModifier.java @@ -66,6 +66,11 @@ public void addModifierListener(final IModifierListener pModifierListener) { } } + @Override + public void clearModifierListeners() { + this.mModifierListeners.clear(); + } + @Override public boolean removeModifierListener(final IModifierListener pModifierListener) { if(pModifierListener == null) { @@ -74,6 +79,10 @@ public boolean removeModifierListener(final IModifierListener pModifierListen return this.mModifierListeners.remove(pModifierListener); } } + + @Override + public void onUnregister(final T pItem) { + } @Override public abstract IModifier deepCopy() throws DeepCopyNotSupportedException; diff --git a/src/org/andengine/util/modifier/BaseSingleValueSpanModifier.java b/src/org/andengine/util/modifier/BaseSingleValueSpanModifier.java index 8ef1eecf5..6152ae4bf 100644 --- a/src/org/andengine/util/modifier/BaseSingleValueSpanModifier.java +++ b/src/org/andengine/util/modifier/BaseSingleValueSpanModifier.java @@ -22,7 +22,7 @@ public abstract class BaseSingleValueSpanModifier extends BaseDurationModifie private float mFromValue; private float mValueSpan; - protected final IEaseFunction mEaseFunction; + protected IEaseFunction mEaseFunction; // =========================================================== // Constructors @@ -67,6 +67,11 @@ public float getFromValue() { public float getToValue() { return this.mFromValue + this.mValueSpan; } + + public IEaseFunction getEaseFunction() { + return mEaseFunction; + } + // =========================================================== // Methods for/from SuperClass/Interfaces @@ -90,13 +95,18 @@ protected void onManagedUpdate(final float pSecondsElapsed, final T pItem) { // =========================================================== // Methods // =========================================================== - + public void reset(final float pDuration, final float pFromValue, final float pToValue) { + reset(pDuration, pFromValue, pToValue, mEaseFunction); + } + + public void reset(final float pDuration, final float pFromValue, final float pToValue, final IEaseFunction pEaseFunction) { super.reset(); this.mDuration = pDuration; this.mFromValue = pFromValue; this.mValueSpan = pToValue - pFromValue; + this.mEaseFunction = pEaseFunction; } // =========================================================== diff --git a/src/org/andengine/util/modifier/IModifier.java b/src/org/andengine/util/modifier/IModifier.java index f85f87ea1..e11c2c41d 100644 --- a/src/org/andengine/util/modifier/IModifier.java +++ b/src/org/andengine/util/modifier/IModifier.java @@ -49,9 +49,12 @@ public int compare(final IModifier pModifierA, final IModifier pModifierB) public float getDuration(); public float onUpdate(final float pSecondsElapsed, final T pItem); + + public void onUnregister(final T pItem); public void addModifierListener(final IModifierListener pModifierListener); public boolean removeModifierListener(final IModifierListener pModifierListener); + public void clearModifierListeners(); // =========================================================== // Inner and Anonymous Classes diff --git a/src/org/andengine/util/modifier/ModifierList.java b/src/org/andengine/util/modifier/ModifierList.java index 5558aa109..94dc91728 100644 --- a/src/org/andengine/util/modifier/ModifierList.java +++ b/src/org/andengine/util/modifier/ModifierList.java @@ -56,6 +56,26 @@ public boolean add(final IModifier pModifier) { return super.add(pModifier); } } + + @Override + public void clear() { + final int modifierCount = this.size(); + if(modifierCount > 0) { + for(int i = modifierCount - 1; i >= 0; i--) { + final IModifier modifier = this.get(i); + modifier.onUnregister(this.mTarget); + } + } + super.clear(); + } + + @Override + public boolean remove(final Object pObject) { + @SuppressWarnings("unchecked") + final IModifier modifier = (IModifier) pObject; + modifier.onUnregister(this.mTarget); + return super.remove(pObject); + } @Override public void onUpdate(final float pSecondsElapsed) { @@ -66,6 +86,7 @@ public void onUpdate(final float pSecondsElapsed) { modifier.onUpdate(pSecondsElapsed, this.mTarget); if(modifier.isFinished() && modifier.isAutoUnregisterWhenFinished()) { this.remove(i); + modifier.onUnregister(this.mTarget); } } }