LibGdx - 屏幕之间的过渡

19

我正在尝试更改Libgdx屏幕之间的动画。 我想编写自己的自定义动画(淡入,淡出等)。 有人能给我一些提示吗? 我似乎找不到Libgdx代码中过渡效果的实现。


你现在使用的设置是什么?你是否正在使用 GameScreen 类? - Steve Blackwell
是的,我有一个处理在屏幕间切换逻辑的类,它实现了Game接口。另外还有两个实现了Screen接口的类(这里我绘制了一个Stage)。 - ruff1991
4个回答

20

这是我的做法:

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);
}

这样做可以延迟屏幕切换,直到淡出完成。


1
我必须对这段代码进行两个小改动才能让它运行。fadeOut(0.5f)Actions.fadeOut(0.5f),以及 run(new Runnable()Actions.run(new Runnable() - Stevoisiak

3
我已经实现了类似的方法。我从Gustavo Steigert的博客中学到了很多内容。你可以在这里找到他的一个带有fadeIn和fadeOut序列的示例。 http://steigert.blogspot.in/2012/02/3-libgdx-tutorial-scene2d.html 你可以完全跟随他的博客,更好地理解事物的流程,并在每篇文章的结尾找到帖子源代码的标签。

7
他的博客已经不再更新了。我建议避开那个博客,因为试图解决那个教程系列留下的问题会让你感到混乱。 - Lokiare

3

1
这个答案在今天 [2014年10月] 仍然有效吗?我花了最近几个小时尝试使用Maven安装alistairrutherford/netthreads-libgdx,但从未成功过。是否有一个安装过程的详细说明? - dawez
2
现在这个链接似乎已经失效了。这就是为什么你永远不应该用一个简单的链接来回答问题。 - Simon Forsberg
1
似乎这只是一个暂时的事情。我仍然不会改变我的投票,因为它仍然是一个仅包含链接的答案,并且您还没有回应dawez的第一条评论。 - Simon Forsberg
这并没有回答问题,问题是关于Screen而不是Scene的。在查看了链接的源代码后,发现Scene只是Stage的扩展,因此与libgdx的Screen概念无关。请参见此处 - EntangledLoops

0
这是我游戏中屏幕过渡动画的示例代码: 在 MainGame 类中:
@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);
            }
        });
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接