package io.github.lonamiwebs.klooni.screens;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.graphics.glutils.FrameBuffer;
import io.github.lonamiwebs.klooni.Klooni;
public class TransitionScreen implements Screen {
//region Members
// Rendering
private FrameBuffer frameBuffer;
private TextureRegion bufferTexture;
private final SpriteBatch spriteBatch;
private float fadedElapsed;
private boolean fadingOut;
private int width, height;
// From, to, and game to change the screen after the transition finishes
private final Screen fromScreen, toScreen;
private final Klooni game;
// Should the previous screen be disposed afterwards? Not desirable
// if it was stored somewhere else, for example, to return to it later
private final boolean disposeAfter;
//endregion
//region Static variables
// Time it takes to fade out and in, 0.15s (0.3s total)
private static final float FADE_INVERSE_DELAY = 1f / 0.15f;
//endregion
//region Constructor
public TransitionScreen(Klooni game, Screen from, Screen to, boolean disposeAfter) {
this.disposeAfter = disposeAfter;
this.game = game;
fromScreen = from;
toScreen = to;
spriteBatch = new SpriteBatch();
}
//endregion
//region Rendering
@Override
public void show() {
fadedElapsed = 0f;
fadingOut = true;
}
@Override
public void render(float delta) {
// Black background since we're fading to black
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// Render on another buffer so then we can set its opacity. This
// second buffer also would allow us to do more stuff, since then
// we can use a texture, which we could move across the screen.
frameBuffer.begin();
float opacity;
if (fadingOut) {
fromScreen.render(delta);
opacity = 1 - Math.min(fadedElapsed * FADE_INVERSE_DELAY, 1);
if (opacity == 0) {
fadedElapsed = 0;
fadingOut = false;
}
}
else {
toScreen.render(delta);
opacity = Math.min(fadedElapsed * FADE_INVERSE_DELAY, 1);
}
frameBuffer.end();
// Render the faded texture
spriteBatch.begin();
spriteBatch.setColor(1, 1, 1, opacity);
spriteBatch.draw(bufferTexture, 0, 0, width, height);
spriteBatch.end();
fadedElapsed += delta;
// We might have finished fading if the opacity is full
if (opacity == 1 && !fadingOut) {
game.setScreen(toScreen);
dispose();
}
}
@Override
public void resize(int width, int height) {
this.width = width;
this.height = height;
if (frameBuffer != null)
frameBuffer.dispose();
frameBuffer = new FrameBuffer(Pixmap.Format.RGB565, width, height, false);
bufferTexture = new TextureRegion(frameBuffer.getColorBufferTexture());
bufferTexture.flip(false, true);
}
//endregion
//region Disposing
@Override
public void dispose() {
frameBuffer.dispose();
if (disposeAfter)
fromScreen.dispose();
}
//endregion
//region Unused methods
@Override
public void pause() { }
@Override
public void resume() { }
@Override
public void hide() { }
//endregion
}