我正在尝试更改Libgdx屏幕之间的动画。 我想编写自己的自定义动画(淡入,淡出等)。 有人能给我一些提示吗? 我似乎找不到Libgdx代码中过渡效果的实现。
这是我的做法:
FadeIn非常简单,只需将以下内容添加到您要淡入的屏幕的show()函数中:
stage.getRoot().getColor().a = 0;
stage.getRoot().addAction(fadeIn(0.5f));
FadeOut比较棘手。您不希望立即切换屏幕,因此不要调用game.setScreen(newScreen),而是在淡出屏幕中创建一个方法,如下所示:
public void switchScreen(final Game game, final Screen newScreen){
stage.getRoot().getColor().a = 1;
SequenceAction sequenceAction = new SequenceAction();
sequenceAction.addAction(fadeOut(0.5f));
sequenceAction.addAction(run(new Runnable() {
@Override
public void run() {
game.setScreen(newScreen);
}
}));
stage.getRoot().addAction(sequenceAction);
}
这样做可以延迟屏幕切换,直到淡出完成。
fadeOut(0.5f)
→ Actions.fadeOut(0.5f)
,以及 run(new Runnable()
→ Actions.run(new Runnable()
。 - Stevoisiak我使用Scene2D和通用缓动引擎实现了一些滑动过渡效果。你可以在这里找到示例代码。
http://www.netthreads.co.uk/2012/02/09/libgdx-scene2d-demo-with-scene-transitions/
更新:本文介绍了我实现滑动转换的方法。底部有一个链接,可以带您到这里的一组演示 https://github.com/alistairrutherford/libgdx-demos
有清晰的说明如何构建演示,但您需要至少基本掌握maven以及如何设置它。
Screen
而不是Scene
的。在查看了链接的源代码后,发现Scene
只是Stage
的扩展,因此与libgdx的Screen
概念无关。请参见此处。 - EntangledLoops@Override public void setScreen(final Screen screen) {
if (getScreen() == null)
{
createScreenInAction(screen);
return;
}
createScreenOutAction(getScreen(), new Runnable() {
@Override public void run() {
createScreenInAction(screen);
}
});
}
private void createScreenOutAction(final Screen screen , Runnable runnable) {
Actor actor = ((BaseScreenAdapter) screen).getStage().getRoot();
actor.setOrigin(WIDTH_HALF,HEIGHT_HALF);
actor.getColor().a = 1;
SequenceAction sequenceAction = new SequenceAction();
sequenceAction.addAction(Actions.parallel(Actions.alpha(0,SCREEN_SWITCH_DURATION) , Actions.scaleTo(1.5f,1.5f , SCREEN_SWITCH_DURATION, Interpolation.exp5)));
sequenceAction.addAction(Actions.run(runnable));
actor.addAction(sequenceAction);
}
private void createScreenInAction(final Screen screen) {
StarsGame.super.setScreen(screen);
Actor actor = ((BaseScreenAdapter) screen).getStage().getRoot();
actor.setOrigin(WIDTH_HALF,HEIGHT_HALF);
actor.getColor().a = 0;
SequenceAction sequenceAction = new SequenceAction();
sequenceAction.addAction(Actions.scaleTo(1.5f,1.5f , 0));
sequenceAction.addAction(Actions.parallel(Actions.alpha(1,SCREEN_SWITCH_DURATION) , Actions.scaleTo(1.0f,1.0f , SCREEN_SWITCH_DURATION , Interpolation.exp5)));
actor.addAction(sequenceAction);
}
而且我所有的屏幕都扩展为BaseScreenAdapter
:
public abstract class BaseScreenAdapter extends ScreenAdapter implements BaseRequest.BaseResponseError{
protected final AssetsController mAssets;
protected final MySettings mSettings;
protected StarsGame mGame;
protected Stage mStage;
protected Viewport mViewport;
protected OrthographicCamera mCamera;
protected InputMultiplexer multiplexer;
protected LoadingActor mLoadingActor;
//==============================================================
// METHODS
//==============================================================
public BaseScreenAdapter(StarsGame game) {
this.mGame = game;
mCamera = new OrthographicCamera(/*StarsGame.WIDTH, StarsGame.HEIGHT*/);
mCamera.position.set(StarsGame.WIDTH_HALF, StarsGame.HEIGHT, 0);
mViewport = new FitViewport(StarsGame.WIDTH, StarsGame.HEIGHT, mCamera);
mCamera.position.set(mCamera.viewportWidth / 2f, mCamera.viewportHeight / 2 , 0);
initStage();
initInputMultiplexer();
}
public Stage getStage() {
return mStage;
}
private void initStage() {
mStage = new Stage(mViewport);
mStage.addListener(new InputListener() {
@Override public boolean keyUp(InputEvent event, int keycode) {
if (keycode == Input.Keys.BACK)
{
onBackPressed();
}
return super.keyUp(event, keycode);
}
});
}
}
Game
和Screen
类? - Steve Blackwell