package com.tacoid.pweekmini;
import java.util.HashMap;
import java.util.Map;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Interpolation;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.Touchable;
public class SwingMenu extends Group{
private int VIRTUAL_WIDTH = 480;
private final double BUSH_HIDE_SPEED = 0.6;
private final double BUTTON_HIDE_SPEED = 1.0;
private final double BUSH_SHOW_SPEED = 0.8;
private final double BUTTON_SHOW_SPEED = 0.9;
private static final float BUTTON_HEIGHT = 250;
private enum State {
SHOWING,
HIDING,
IDLE;
};
private Map<String,Group> menus;
private Group currentGroup;
private String currentName;
private Interpolation interpButton;
private float timeBush;
private float timeButton;
private State state = State.IDLE;
private boolean switching = false;
private String nextMenu;
private class BushActor extends Actor {
public BushActor() {
}
@Override
public void draw(SpriteBatch batch, float delta) {
boolean keepGoing = false;
switch(state) {
case HIDING:
if(timeBush >= 0.5f) {
timeBush-=Gdx.graphics.getDeltaTime()*BUSH_HIDE_SPEED;
keepGoing = true;
}
if( timeButton >= -0.1f) {
timeButton-=Gdx.graphics.getDeltaTime()*BUTTON_HIDE_SPEED;
keepGoing = true;
}
if(!keepGoing) {
if(switching) {
show(nextMenu);
} else {
setTouchable(Touchable.disabled);
setVisible(false);
state = State.IDLE;
}
}
break;
case SHOWING:
if(timeBush <= 1.0f) {
timeBush+=Gdx.graphics.getDeltaTime()*BUSH_SHOW_SPEED;
keepGoing = true;
}
if( timeButton <= 1.0f) {
timeButton+=Gdx.graphics.getDeltaTime()*BUTTON_SHOW_SPEED;
keepGoing = true;
}
if(!keepGoing){
state = State.IDLE;
}
break;
case IDLE:
break;
}
currentGroup.setY(interpButton.apply(-BUTTON_HEIGHT, 85, Math.min(timeButton, 1.0f)));
/*
for(int i=0; i<currentGroup.size(); i++) {
currentList.get(i).y = interpButton.apply(0, BUTTON_HEIGHT, Math.min(timeButton,1.0f));
}*/
}
@Override
public Actor hit(float arg0, float arg1, boolean touchable) {
// TODO Auto-generated method stub
return null;
}
}
public SwingMenu() {
interpButton = new Interpolation.SwingOut(1.5f);
menus = new HashMap<String, Group>();
}
public void initBegin(String menu) {
menus.put(menu, new Group());
currentGroup = menus.get(menu);
currentName = menu;
}
public void addButton( Actor actor) {
currentGroup.addActor(actor);
}
public void initEnd() {
int size = currentGroup.getChildren().size;
int i = 0;
for (Actor a : currentGroup.getChildren()) {
a.setX(VIRTUAL_WIDTH / 2 - a.getWidth() / 2);
a.setY((size - (i + 1)) * (a.getHeight() + 13));
i++;
}
}
public void show(String menu)
{
this.clear();
currentGroup = menus.get(menu);
currentName = menu;
this.addActor(currentGroup);
this.addActor(new BushActor());
state=State.SHOWING;
timeBush = 0.5f;
timeButton = -0.2f;
setTouchable(Touchable.enabled);
setVisible(true);
/* On initialise le y ici, car dans la file de rendering, les bouttons sont en premiers, et passent donc apr�s le BushActor qui set la position des bouttons. */
currentGroup.setY(interpButton.apply(-BUTTON_HEIGHT, 0, Math.min(timeButton,1.0f)));
switching = false;
}
public void hide() {
state=State.HIDING;
}
public void hideInstant() {
state=State.HIDING;
timeBush = 0.5f;
timeButton = -0.2f;
}
/* Change de menu avec animation */
public void switchMenuAnimated(String menu) {
this.hide();
switching = true;
nextMenu = menu;
}
/* Change de menu sans animation */
public void switchMenu(String menu) {
this.clear();
currentGroup = menus.get(menu);
this.addActor(currentGroup);
this.addActor(new BushActor());
}
public String getCurrentMenu() {
return currentName;
}
}