LibGdx - переход между экранами

Я пытаюсь изменить анимацию между экранами Libgdx. Я хочу написать свою собственную анимацию (затухать, исчезать и т.д.). Может ли кто-нибудь дать мне ключ? Я не могу найти реализацию перехода в коде Libgdx.

4 ответа

Я реализовал некоторые сдвижные переходы, используя Scene2D и универсальный движок анимации. Здесь вы можете найти пример кода.

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

Обновление: эта статья иллюстрирует подход, который я предпринял для реализации скользящих переходов. Внизу есть ссылка, которая приведет вас к набору демонстраций здесь https://github.com/alistairrutherford/libgdx-demos

Есть четкие инструкции о том, как создавать демоверсии, но вам нужно иметь хотя бы базовое представление о maven и о том, как его настроить.


Вот что я делаю:

FadeIn довольно прост, просто добавьте это в свой экран fadein Screens():

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

FadeOut немного сложнее. Вы не хотите сразу переключаться с экранов, поэтому вместо вызова game.setScreen(newScreen) создайте метод на вашем экране Fadeout следующим образом:

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

Таким образом, вы задерживаете переключение экрана на время выгорания.


Я реализовал аналогичные методы. Благодаря Gustavo Steigert, я многому научился из своего блога здесь, где вы можете найти его пример с последовательностью fadeIn и fadeOut.

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

Вы можете полностью следить за своим блогом, чтобы лучше понять поток вещей и найти теги для исходного кода в конце каждого, если его сообщения.


Это пример кода моей игры в анимации переходов между экранами: в классе 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);
 }
 });
 }
}

licensed under cc by-sa 3.0 with attribution.