/**
* Copyright 2008 - 2011
*
* 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.
*
* @project loon
* @author cping
* @email:javachenpeng@yahoo.com
* @version 0.1
*/
package loon;
import loon.action.map.Config;
import loon.action.sprite.effect.ArcEffect;
import loon.action.sprite.effect.CrossEffect;
import loon.action.sprite.effect.FadeEffect;
import loon.action.sprite.effect.PShadowEffect;
import loon.action.sprite.effect.SplitEffect;
import loon.core.graphics.device.LColor;
import loon.core.graphics.opengl.GLEx;
import loon.core.graphics.opengl.LTexture;
import loon.core.graphics.opengl.TextureUtils;
import loon.utils.MathUtils;
/**
* 自0.3.2版起新增的Screen切换过渡效果类,内置有多种过渡特效。
*
* example:
*
* public class Sample extends Screen{
*
* ......
*
* public LTransition onTransition(){ return LTransition.xxx(method) } }
*
*
*/
public class LTransition {
/**
* 随机的百叶窗特效
*
* @return
*/
public final static LTransition newCrossRandom() {
return newCrossRandom(LColor.black);
}
/**
* 百叶窗特效
*
* @param c
* @return
*/
public final static LTransition newCrossRandom(LColor c) {
return newCross(MathUtils.random(0, 1), TextureUtils.createTexture(
LSystem.screenRect.width, LSystem.screenRect.height, c));
}
/**
* 百叶窗特效
*
* @param c
* @return
*/
public final static LTransition newCross(final int c, final LTexture texture) {
if (GLEx.self != null) {
final LTransition transition = new LTransition();
transition.setTransitionListener(new TransitionListener() {
final CrossEffect cross = new CrossEffect(c, texture);
public void draw(GLEx g) {
cross.createUI(g);
}
public void update(long elapsedTime) {
cross.update(elapsedTime);
}
public boolean completed() {
return cross.isComplete();
}
public void dispose() {
cross.dispose();
}
});
transition.setDisplayGameUI(true);
transition.code = 1;
return transition;
}
return null;
}
/**
* 默认使用黑色的圆弧渐变特效
*
* @return
*/
public final static LTransition newArc() {
return newArc(LColor.black);
}
/**
* 单一色彩的圆弧渐变特效
*
* @return
*/
public final static LTransition newArc(final LColor c) {
if (GLEx.self != null) {
final LTransition transition = new LTransition();
transition.setTransitionListener(new TransitionListener() {
final ArcEffect arc = new ArcEffect(c);
public void draw(GLEx g) {
arc.createUI(g);
}
public void update(long elapsedTime) {
arc.update(elapsedTime);
}
public boolean completed() {
return arc.isComplete();
}
public void dispose() {
arc.dispose();
}
});
transition.setDisplayGameUI(true);
transition.code = 1;
return transition;
}
return null;
}
/**
* 产生一个Screen画面向双向分裂的过渡特效
*
* @param texture
* @return
*/
public final static LTransition newSplitRandom(LTexture texture) {
return newSplit(MathUtils.random(0, Config.TDOWN), texture);
}
/**
* 产生一个Screen画面向双向分裂的过渡特效
*
* @param c
* @return
*/
public final static LTransition newSplitRandom(LColor c) {
return newSplitRandom(TextureUtils.createTexture(
LSystem.screenRect.width, LSystem.screenRect.height, c));
}
/**
* 产生一个Screen画面向双向分裂的过渡特效(方向的静态值位于Config类中)
*
* @param d
* @param texture
* @return
*/
public final static LTransition newSplit(final int d, final LTexture texture) {
if (GLEx.self != null) {
final LTransition transition = new LTransition();
transition.setTransitionListener(new TransitionListener() {
final SplitEffect split = new SplitEffect(texture, d);
public void draw(GLEx g) {
split.createUI(g);
}
public void update(long elapsedTime) {
split.update(elapsedTime);
}
public boolean completed() {
return split.isComplete();
}
public void dispose() {
split.dispose();
}
});
transition.setDisplayGameUI(true);
transition.code = 1;
return transition;
}
return null;
}
/**
* 产生一个黑色的淡入效果
*
* @return
*/
public final static LTransition newFadeIn() {
return LTransition.newFade(FadeEffect.TYPE_FADE_IN);
}
/**
* 产生一个黑色的淡出效果
*
* @return
*/
public final static LTransition newFadeOut() {
return LTransition.newFade(FadeEffect.TYPE_FADE_OUT);
}
/**
* 产生一个黑色的淡入/淡出效果
*
* @param type
* @return
*/
public final static LTransition newFade(int type) {
return LTransition.newFade(type, LColor.black);
}
/**
* 产生一个指定色彩的淡入效果
*
* @param c
* @return
*/
public final static LTransition newFade(final int type, final LColor c) {
if (GLEx.self != null) {
final LTransition transition = new LTransition();
transition.setTransitionListener(new TransitionListener() {
final FadeEffect fade = FadeEffect.getInstance(type, c);
public void draw(GLEx g) {
fade.createUI(g);
}
public void update(long elapsedTime) {
fade.update(elapsedTime);
}
public boolean completed() {
return fade.isStop();
}
public void dispose() {
fade.dispose();
}
});
transition.setDisplayGameUI(true);
transition.code = 1;
return transition;
}
return null;
}
/**
* 以指定地址图片作渐变式过滤(实际上这种过渡方式所能产生的效果是无穷的,具体可参考吉里吉里(krkr) 用过渡图)
*
* @param fileName
* @param alhpa
*/
public final static LTransition newPShadow(String fileName, float alhpa) {
PShadowEffect shadow = new PShadowEffect(fileName);
shadow.setAlpha(alhpa);
return newPShadow(shadow);
}
/**
* 以指定地址图片作渐变式过滤
*
* @param fileName
*/
public final static LTransition newPShadow(String fileName) {
return newPShadow(fileName, 0.5f);
}
/**
* 转化PShadowEffect为LTransition
*
* @param effect
* @return
*/
public final static LTransition newPShadow(final PShadowEffect effect) {
if (GLEx.self != null) {
final LTransition transition = new LTransition();
transition.setTransitionListener(new TransitionListener() {
public void draw(GLEx g) {
effect.createUI(g);
}
public void update(long elapsedTime) {
effect.update(elapsedTime);
}
public boolean completed() {
return effect.isComplete();
}
public void dispose() {
effect.dispose();
}
});
transition.setDisplayGameUI(true);
transition.code = 1;
return transition;
}
return null;
}
public final static LTransition newEmpty() {
final LTransition transition = new LTransition();
transition.setTransitionListener(new TransitionListener() {
public void draw(GLEx g) {
}
public void update(long elapsedTime) {
}
public boolean completed() {
return true;
}
public void dispose() {
}
});
transition.setDisplayGameUI(true);
transition.code = 1;
return transition;
}
public static interface TransitionListener {
public void update(long elapsedTime);
public void draw(GLEx g);
public boolean completed();
public void dispose();
}
// 是否在在启动过渡效果同时显示游戏画面(即是否顶层绘制过渡画面,底层同时绘制标准游戏画面)
boolean isDisplayGameUI;
int code;
TransitionListener listener;
public void setDisplayGameUI(boolean s) {
this.isDisplayGameUI = s;
}
public boolean isDisplayGameUI() {
return this.isDisplayGameUI;
}
public void setTransitionListener(TransitionListener l) {
this.listener = l;
}
public TransitionListener getTransitionListener() {
return this.listener;
}
final void update(long elapsedTime) {
if (listener != null) {
listener.update(elapsedTime);
}
}
final void draw(GLEx g) {
if (listener != null) {
listener.draw(g);
}
}
final boolean completed() {
if (listener != null) {
return listener.completed();
}
return false;
}
final void dispose() {
if (listener != null) {
listener.dispose();
}
}
}