blob: e47cb48fd0b05aa18693226285075f3f25a30da0 [file] [log] [blame]
/*
* 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;
}
}