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