web-dev-qa-db-fra.com

LibGdx - Transition entre les écrans

J'essaie de changer l'animation entre les écrans Libgdx. Je veux écrire mon animation personnalisée (ouverture en fondu, fermeture en fondu, etc.). Quelqu'un peut-il me donner un indice? Je n'arrive pas à trouver l'implémentation de la transition dans le code Libgdx.

16
ruff1991

J'ai mis en œuvre des transitions glissantes à l'aide de Scene2D et du moteur d'interpolation universel. Vous pouvez trouver un exemple de code ici.

http://www.netthreads.co.uk/2012/02/09/libgdx-scene2d-demo-with-scene-transitions/

Mise à jour: Cet article illustre l'approche que j'ai adoptée pour implémenter des transitions glissantes. Il y a un lien en bas qui vous mène à une série de démos ici https://github.com/alistairrutherford/libgdx-demos

Il existe des instructions claires sur la construction des démos, mais vous devez au moins avoir une connaissance de base de maven et de sa configuration.

5
alrutherford

Voici ce que je fais:

FadeIn est assez simple, ajoutez simplement ceci à votre émission d'écrans de fadein ():

stage.getRoot().getColor().a = 0;
stage.getRoot().addAction(fadeIn(0.5f));

FadeOut est un peu plus compliqué. Vous ne voulez pas changer d'écran immédiatement, alors au lieu d'appeler game.setScreen (newScreen), créez une méthode dans votre écran de fondu comme ceci:

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

Ainsi, vous retardez le changement d’écran pendant la durée du fondu.

12
Kedu

J'ai mis en œuvre des méthodes similaires. Grâce à Gustavo Steigert, son blog m'a beaucoup appris. Vous trouverez ici l'exemple de la séquence fadeIn et fadeOut.

http://steigert.blogspot.in/2012/02/3-libgdx-tutorial-scene2d.html

Vous pouvez suivre son blog complètement pour avoir une meilleure idée du flux des choses et trouver les balises pour le code source du message à la fin de chaque message.

4
alex

Voici un exemple de code de mon jeu en animation de transitions entre écrans: dans la classe 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);

    }

et tous mes écrans s'étend comme 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);
            }
        });
    }
}
0
Richi