package se.danielj.skuttandenyancat;
import se.danielj.skuttandenyancat.Controller.Scene;
import se.danielj.skuttandenyancat.misc.Constants;
import se.danielj.skuttandenyancat.misc.Energy;
import se.danielj.skuttandenyancat.misc.GameController;
import se.danielj.skuttandenyancat.misc.Score;
import se.danielj.skuttandenyancat.misc.State;
import se.danielj.skuttandenyancat.systems.CameraSystem;
import se.danielj.skuttandenyancat.systems.CollisionSystem;
import se.danielj.skuttandenyancat.systems.EffectSystem;
import se.danielj.skuttandenyancat.systems.EntityRemoverSystem;
import se.danielj.skuttandenyancat.systems.GameOverSystem;
import se.danielj.skuttandenyancat.systems.GravitySystem;
import se.danielj.skuttandenyancat.systems.HudRenderSystem;
import se.danielj.skuttandenyancat.systems.MovementSystem;
import se.danielj.skuttandenyancat.systems.MusicVolumeSystem;
import se.danielj.skuttandenyancat.systems.ParallaxBackgroundSystem;
import se.danielj.skuttandenyancat.systems.PlayerInputSystem;
import se.danielj.skuttandenyancat.systems.PoleSpawnerSystem;
import se.danielj.skuttandenyancat.systems.SpriteRenderSystem;
import se.danielj.skuttandenyancat.systems.StarSpawnerSystem;
import com.artemis.World;
import com.artemis.managers.GroupManager;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputMultiplexer;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
/**
*
* @author Daniel Jonsson
* @license GNU GPLv3
*
*/
public class Game implements GameController {
private OrthographicCamera camera;
private World world;
private SpriteRenderSystem spriteRenderSystem;
private HudRenderSystem hudRenderSystem;
private EffectSystem particleEffectSystem;
private MusicVolumeSystem musicVolumeSystem;
private RunningState currentState;
private RunningState drawState;
private RunningState pauseState;
private Controller controller;
private InputMultiplexer inputMultiplexer;
private boolean running;
private SpriteBatch batch;
public Game(Controller controller, InputMultiplexer inputMultiplexer) {
this.controller = controller;
this.inputMultiplexer = inputMultiplexer;
running = false;
}
@Override
public void create() {
inputMultiplexer.clear();
camera = new OrthographicCamera(Constants.FRAME_WIDTH, Constants.FRAME_HEIGHT);
Energy.init();
Score.init();
State.init();
world = new World();
world.setManager(new GroupManager());
world.setSystem(new ParallaxBackgroundSystem(1200));
world.setSystem(new PlayerInputSystem(inputMultiplexer, this));
world.setSystem(new GravitySystem());
world.setSystem(new MovementSystem());
world.setSystem(new CollisionSystem());
world.setSystem(new PoleSpawnerSystem(2));
world.setSystem(new EntityRemoverSystem(1));
world.setSystem(new StarSpawnerSystem(5.2f));
world.setSystem(new CameraSystem(camera));
world.setSystem(new GameOverSystem(1, this));
batch = new SpriteBatch();
batch.setProjectionMatrix(camera.combined);
particleEffectSystem = world.setSystem(new EffectSystem(batch), true);
spriteRenderSystem = world.setSystem(new SpriteRenderSystem(camera, batch), true);
hudRenderSystem = world.setSystem(new HudRenderSystem(this, inputMultiplexer), true);
musicVolumeSystem = world.setSystem(new MusicVolumeSystem(), true);
musicVolumeSystem.play();
world.initialize();
EntityFactory.createBackground(world, 0, 0).addToWorld();
EntityFactory.createBackground(world, 1200 * Constants.ZOOM - 5, 0).addToWorld();
EntityFactory.createBackground2(world, 0, -100 * Constants.ZOOM).addToWorld();
EntityFactory.createBackground2(world, 1200 * Constants.ZOOM - 5, -100 * Constants.ZOOM).addToWorld();
EntityFactory.createNyanCat(world, -50 * Constants.ZOOM, 100 * Constants.ZOOM).addToWorld();
EntityFactory.createPole(world, 0, -100 * Constants.ZOOM).addToWorld();
EntityFactory.createPole(world, 400 * Constants.ZOOM, -100 * Constants.ZOOM).addToWorld();
drawState = new Draw();
pauseState = new Pause();
currentState = drawState;
running = true;
}
@Override
public void render() {
currentState.process();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
currentState = pauseState;
hudRenderSystem.showPauseMenu(true);
musicVolumeSystem.stop();
}
@Override
public void resume() {
}
@Override
public void dispose() {
particleEffectSystem.dispose();
hudRenderSystem.dispose();
batch.dispose();
}
@Override
public void continueGame() {
currentState = drawState;
hudRenderSystem.showPauseMenu(false);
musicVolumeSystem.play();
}
@Override
public void gameOver() {
currentState = pauseState;
hudRenderSystem.showGameOverMenu(true);
running = false;
musicVolumeSystem.stop();
}
@Override
public void exit() {
musicVolumeSystem.stopCompletely();
controller.setScene(Scene.MAIN_MENU);
particleEffectSystem.dispose();
}
@Override
public void back() {
if (running) {
pause();
musicVolumeSystem.stopCompletely();
controller.setScene(Scene.MAIN_MENU);
} else {
exit();
}
}
@Override
public void restart() {
dispose();
create();
}
public boolean isRunning() {
return running;
}
public void reset() {
restart();
}
private interface RunningState {
public void process();
}
private class Draw implements RunningState {
public void process() {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
camera.update();
float delta = Gdx.graphics.getDeltaTime();
world.setDelta(delta);
world.process();
spriteRenderSystem.process();
particleEffectSystem.process();
hudRenderSystem.process();
musicVolumeSystem.process();
}
}
private class Pause implements RunningState {
public void process() {
world.setDelta(0);
spriteRenderSystem.process();
particleEffectSystem.process();
hudRenderSystem.process();
world.setDelta(Gdx.graphics.getDeltaTime());
musicVolumeSystem.process();
}
}
}