package fr.wisper.screens.gamescreen;
import aurelienribon.tweenengine.BaseTween;
import aurelienribon.tweenengine.Tween;
import aurelienribon.tweenengine.TweenCallback;
import aurelienribon.tweenengine.TweenManager;
import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.List;
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.Scaling;
import com.badlogic.gdx.utils.viewport.ScalingViewport;
import fr.wisper.Game.WisperGame;
import fr.wisper.assets.WisperChooseAssets;
import fr.wisper.entities.AnimatedWisper;
import fr.wisper.animations.tween.TableAccessor;
import fr.wisper.entities.Wisper;
import fr.wisper.screens.loading.LoadingScreen;
import fr.wisper.utils.Config;
import fr.wisper.utils.Debug;
import fr.wisper.utils.ExtendedStage;
public class WisperChooseMenu implements FadingScreen {
// Stage
private ExtendedStage<WisperChooseMenu> stage;
private Table table;
private Skin skin;
List<String> list;
// Wisper
private final String CHOSEN_WISPER = "chosen-wisper";
private SpriteBatch batch;
private AnimatedWisper wisper;
// Tween
private TweenManager tweenManager;
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0.95f, 0.95f, 0.95f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// Manage camera
WisperGame.Camera.update();
// Stage
stage.act(delta);
stage.draw();
// Wisper
batch.setProjectionMatrix(WisperGame.Camera.combined);
batch.begin();
wisper.draw(batch, delta);
batch.end();
// Update animations
tweenManager.update(delta);
}
@Override
public void resize(int width, int height) {
WisperGame.Camera.zoom = 1f;
WisperGame.Camera.updateViewport();
ScalingViewport stageViewport = new ScalingViewport(
Scaling.fit,
WisperGame.VirtualViewport.getVirtualWidth(),
WisperGame.VirtualViewport.getVirtualHeight(),
WisperGame.Camera);
stage.setViewport(stageViewport);
stage.getViewport().update(width, height, true);
table.invalidateHierarchy();
}
@Override
public void show() {
// Stage
stage = new ExtendedStage(this, new MainMenu());
Gdx.input.setInputProcessor(stage);
Gdx.input.setCatchBackKey(true);
skin = WisperChooseAssets.manager.get(WisperChooseAssets.GlobalSkin);
// Table
table = new Table(skin);
table.setFillParent(true);
createTable();
// Animations
initAnimations();
// Wisper
batch = new SpriteBatch();
if (WisperGame.preferences.getInteger(CHOSEN_WISPER) != Wisper.BLACK_WISPER) {
list.setSelectedIndex(WisperGame.preferences.getInteger(CHOSEN_WISPER));
} else {
chooseWisper(Wisper.BLACK_WISPER);
}
}
private void initAnimations() {
tweenManager = new TweenManager();
Tween.registerAccessor(Table.class, new TableAccessor());
Tween.set(table, TableAccessor.ALPHA).target(0).start(tweenManager);
Tween.to(table, TableAccessor.ALPHA, Config.ANIMATION_DURATION).target(1).start(tweenManager);
tweenManager.update(Float.MIN_VALUE);
}
public void fadeTo(final FadingScreen screen) {
wisper.stopDraw();
Tween.set(table, TableAccessor.ALPHA).target(1).start(tweenManager);
Tween.to(table, TableAccessor.ALPHA, Config.ANIMATION_DURATION / 3f).target(0).setCallback(new TweenCallback() {
@Override
public void onEvent(int type, BaseTween<?> source) {
LoadingScreen loader = ((WisperGame) Gdx.app.getApplicationListener()).getLoader();
loader.setNextScreen(screen);
}
}).start(tweenManager);
WisperGame.preferences.putInteger(CHOSEN_WISPER, list.getSelectedIndex());
WisperGame.preferences.flush();
}
@Override
public AssetManager getAssetManager() {
return WisperChooseAssets.manager;
}
@Override
public void load() {
WisperChooseAssets.load();
}
private void createTable() {
list = new List<String>(skin);
list.setItems(new String[] {"Thanatos", "Spark", "Bloody"});
list.addListener(new ListListener());
ScrollPane scrollPane = new ScrollPane(list, skin);
TextButton start = new TextButton("Start", skin, "medium");
start.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
fadeTo(new GameScreen(list.getSelectedIndex()));
}
});
start.pad(10);
table.padTop(50);
table.add(new Label("Select your Wisper", skin, "big-bold")).colspan(2).expandX().spaceBottom(125).row();
table.add(scrollPane).padLeft(10).minWidth(250).top().left();
table.add(wisper).uniformX().expandX().expandY().center().row();
table.add(start).colspan(2).expandX().bottom();
table.padBottom(50);
stage.addActor(table);
}
public void setWisper(AnimatedWisper wisper) {
if (this.wisper != null) {
this.wisper.dispose();
}
this.wisper = wisper;
wisper.animate(tweenManager);
}
@Override
public void hide() {
dispose();
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
batch.dispose();
stage.dispose();
wisper.dispose();
skin.dispose();
}
public void chooseWisper(int chosenWisper) {
switch (chosenWisper) {
case Wisper.BLACK_WISPER:
setWisper(new AnimatedWisper("particles/black-wisper-big-noadditive.p"));
break;
case Wisper.BLUE_WISPER:
setWisper(new AnimatedWisper("particles/blue-wisper-big-noadditive.p"));
break;
case Wisper.RED_WISPER:
setWisper(new AnimatedWisper("particles/red-wisper-big-noadditive.p"));
break;
default:
break;
}
}
private class ListListener extends ChangeListener {
@Override
public void changed(ChangeEvent event, Actor actor) {
Debug.Log(list.getSelected().toString() + " selected");
chooseWisper(list.getSelectedIndex());
}
}
}