package sk.neuromancer.sphaera.rewrite; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle; import com.badlogic.gdx.scenes.scene2d.ui.Skin; import com.badlogic.gdx.scenes.scene2d.ui.TextButton; import com.badlogic.gdx.scenes.scene2d.ui.TextButton.TextButtonStyle; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.badlogic.gdx.utils.viewport.StretchViewport; import com.badlogic.gdx.utils.viewport.Viewport; public class Menu extends GameState{ private MenuState state; private World world; private float score; private Stage ui; private TextButton playButton; private TextButton exitButton; private Image logo; private Label scoreLabel; private Label howToLabel; private Label by; private TextButtonStyle buttonStyle; private LabelStyle labelStyle; public static final String LOGO = "logo.png"; public static final String BUTTON = "button.png"; public Menu(Object... remains){ super(remains); if(remains.length > 0){ state = (MenuState) remains[0]; }else{ state = MenuState.START; } switch(state){ case WIN: case PAUSE: case POST: if(remains.length > 1){ world = (World) remains[1]; if(remains.length > 2){ this.score = (Float) remains[2]; } }else{ world = new World(); } break; case START: world = new World(); break; default: break; } ui = new Stage(); Skin skin = new Skin(); logo = new Image(new Texture(Gdx.files.internal(LOGO))); buttonStyle = new TextButtonStyle(); Texture buttonTexture = new Texture(Gdx.files.internal(BUTTON)); buttonStyle.up = new TextureRegionDrawable(new TextureRegion(buttonTexture)); if(!buttonTexture.getTextureData().isPrepared()){ buttonTexture.getTextureData().prepare(); } Pixmap downPixmap = buttonTexture.getTextureData().consumePixmap(); downPixmap.setColor(0.5f, 0, 0, 0.3f); downPixmap.fillRectangle(5, 5, 55, 23); buttonStyle.down = new TextureRegionDrawable(new TextureRegion(new Texture(downPixmap))); buttonStyle.font = new BitmapFont(); labelStyle = new LabelStyle(new BitmapFont(), Color.BLACK); skin.add("default", buttonStyle); skin.add("label", labelStyle); float width = Gdx.graphics.getWidth(); float height = Gdx.graphics.getHeight(); playButton = new TextButton("PLAY", skin); playButton.setSize(width/2.5f, width/6); playButton.setPosition(width/2f - width/2.5f, height/3f); playButton.addListener(new ClickListener(){ @Override public void clicked(InputEvent event, float x, float y) { playClick(); } }); exitButton = new TextButton("EXIT", skin); exitButton.setSize(width/2.5f, width/6); exitButton.setPosition(width/2f, height/3f); exitButton.addListener(new ClickListener(){ @Override public void clicked(InputEvent event, float x, float y) { exitClick(); } }); logo.setPosition(width/2 - width/4, width/4); logo.setSize(width/2, width/2); String scoreString = score == 0 ? "" : "Score:" + Float.toString(score); scoreLabel = new Label(scoreString, skin, "label"); scoreLabel.setPosition(width/16, 7 * height/8); scoreLabel.setFontScale(5); String howToString = state == MenuState.WIN ? "Congrats! You have won." : "Collect the blue spheres, avoid red ones. Grow! \nSPACE to move. A,D to rotate, SCROLL to zoom."; howToLabel = new Label(howToString, skin, "label"); howToLabel.setPosition(width/12, height/8); howToLabel.setFontScale(2.5f); by = new Label("by J08nY", skin, "label"); by.setPosition(width/2 + width/4, width/2); ui.addActor(logo); ui.addActor(by); ui.addActor(scoreLabel); ui.addActor(howToLabel); ui.addActor(playButton); ui.addActor(exitButton); } @Override public void show() { resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); Gdx.input.setInputProcessor(ui); } @Override public void render(float delta) { Gdx.gl.glClearColor(1,1,1,1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); ui.draw(); } public void playClick(){ this.finish(); if(this.world != null) this.world.dispose(); this.setNext(new World(this)); } public void exitClick(){ this.finish(); if(this.world != null) this.world.dispose(); this.setNext(new Exit()); } @Override public void tick(long tickCount) { ui.act(1/SphaeraGame.TPS); } @Override public void resize(int width, int height) { } @Override public void pause() { } @Override public void resume() { } @Override public void hide() { Gdx.gl.glClearColor(1,1,1,1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); } @Override public void dispose() { if(ui != null) ui.dispose(); } public enum MenuState{ START, PAUSE, POST, WIN; } @Override public GameState next() { switch(state){ case PAUSE: //world or exit break; case POST: //world or exit break; case START: //world or exit break; default: break; } return super.next(); } }