| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.replica.replicaisland; |
| |
| public class FadeDrawableComponent extends GameComponent { |
| public static final int LOOP_TYPE_NONE = 0; |
| public static final int LOOP_TYPE_LOOP = 1; |
| public static final int LOOP_TYPE_PING_PONG = 2; |
| |
| public static final int FADE_LINEAR = 0; |
| public static final int FADE_EASE = 1; |
| |
| private Texture mTexture; |
| private RenderComponent mRenderComponent; |
| private float mInitialOpacity; |
| private float mTargetOpacity; |
| private float mStartTime; |
| private float mDuration; |
| private int mLoopType; |
| private int mFunction; |
| private float mInitialDelay; |
| private float mInitialDelayTimer; |
| private float mActivateTime; |
| private float mPhaseDuration; |
| |
| public FadeDrawableComponent() { |
| super(); |
| setPhase(ComponentPhases.PRE_DRAW.ordinal()); |
| } |
| |
| @Override |
| public void reset() { |
| mTexture = null; |
| mRenderComponent = null; |
| mInitialOpacity = 0.0f; |
| mTargetOpacity = 0.0f; |
| mDuration = 0.0f; |
| mLoopType = LOOP_TYPE_NONE; |
| mFunction = FADE_LINEAR; |
| mStartTime = 0.0f; |
| mInitialDelay = 0.0f; |
| mActivateTime = 0.0f; |
| mPhaseDuration = 0.0f; |
| mInitialDelayTimer = 0.0f; |
| } |
| |
| @Override |
| public void update(float timeDelta, BaseObject parent) { |
| if (mRenderComponent != null) { |
| final TimeSystem time = sSystemRegistry.timeSystem; |
| final float currentTime = time.getGameTime(); |
| |
| // Support repeating "phases" on top of the looping fade itself. |
| // Complexity++, but it lets this component handle several |
| // different use cases. |
| if (mActivateTime == 0.0f) { |
| mActivateTime = currentTime; |
| mInitialDelayTimer = mInitialDelay; |
| } else if (mPhaseDuration > 0.0f && currentTime - mActivateTime > mPhaseDuration) { |
| mActivateTime = currentTime; |
| mInitialDelayTimer = mInitialDelay; |
| mStartTime = 0.0f; |
| } |
| |
| if (mInitialDelayTimer > 0.0f) { |
| mInitialDelayTimer -= timeDelta; |
| } else { |
| if (mStartTime == 0) { |
| mStartTime = currentTime; |
| } |
| float elapsed = currentTime - mStartTime; |
| float opacity = mInitialOpacity; |
| if (mLoopType != LOOP_TYPE_NONE && elapsed > mDuration) { |
| final float endTime = mStartTime + mDuration; |
| elapsed = endTime - currentTime; |
| mStartTime = endTime; |
| if (mLoopType == LOOP_TYPE_PING_PONG) { |
| float temp = mInitialOpacity; |
| mInitialOpacity = mTargetOpacity; |
| mTargetOpacity = temp; |
| } |
| } |
| |
| if (elapsed > mDuration) { |
| opacity = mTargetOpacity; |
| } else if (elapsed != 0.0f) { |
| if (mFunction == FADE_LINEAR) { |
| opacity = Lerp.lerp(mInitialOpacity, mTargetOpacity, mDuration, elapsed); |
| } else if (mFunction == FADE_EASE) { |
| opacity = Lerp.ease(mInitialOpacity, mTargetOpacity, mDuration, elapsed); |
| } |
| } |
| |
| if (mTexture != null) { |
| // If a texture is set then we supply a drawable to the render component. |
| // If not, we take whatever drawable the renderer already has. |
| final DrawableFactory factory = sSystemRegistry.drawableFactory; |
| if (factory != null) { |
| GameObject parentObject = ((GameObject)parent); |
| DrawableBitmap bitmap = factory.allocateDrawableBitmap(); |
| bitmap.resize((int)mTexture.width, (int)mTexture.height); |
| //TODO: Super tricky scale. fix this! |
| bitmap.setWidth((int)parentObject.width); |
| bitmap.setHeight((int)parentObject.height); |
| bitmap.setOpacity(opacity); |
| bitmap.setTexture(mTexture); |
| mRenderComponent.setDrawable(bitmap); |
| } |
| } else { |
| DrawableObject drawable = mRenderComponent.getDrawable(); |
| // TODO: ack, instanceof! Fix this! |
| if (drawable != null && drawable instanceof DrawableBitmap) { |
| ((DrawableBitmap)drawable).setOpacity(opacity); |
| } |
| } |
| } |
| } |
| } |
| |
| public void setupFade(float startOpacity, float endOpacity, float duration, int loopType, int function, float initialDelay) { |
| mInitialOpacity = startOpacity; |
| mTargetOpacity = endOpacity; |
| mDuration = duration; |
| mLoopType = loopType; |
| mFunction = function; |
| mInitialDelay = initialDelay; |
| } |
| |
| /** Enables phases; the initial delay will be re-started when the phase ends. **/ |
| public void setPhaseDuration(float duration) { |
| mPhaseDuration = duration; |
| } |
| |
| /** If set to something non-null, this component will overwrite the drawable on the target render component. **/ |
| public void setTexture(Texture texture) { |
| mTexture = texture; |
| } |
| |
| public void setRenderComponent(RenderComponent component) { |
| mRenderComponent = component; |
| } |
| |
| public void resetPhase() { |
| mActivateTime = 0.0f; |
| } |
| } |