package com.tacoid.superflu;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.audio.Music;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.tacoid.superflu.actors.GlobalStatsActor;
import com.tacoid.superflu.actors.TransfertActor;
import com.tacoid.superflu.actors.TransfertCreator;
import com.tacoid.superflu.actors.VilleActor;
import com.tacoid.superflu.actors.ZoneActor;
import com.tacoid.superflu.entities.Carte;
import com.tacoid.superflu.entities.Usine;
import com.tacoid.superflu.entities.Ville;
import com.tacoid.superflu.entities.Zone;
public class GameScreen implements Screen {
private static final int VIRTUAL_WIDTH = 1024;
private static final int VIRTUAL_HEIGHT = 576;
private static GameScreen instance;
private Stage stage;
private Group groupZones;
private Group groupVilles;
private Group groupTransferts;
private GameLogic gameLogic;
private SuperFlu superflu;
private GameScreen() {
this.superflu = SuperFlu.getInstance();
stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
groupZones = new Group();
groupVilles = new GroupVilles();
groupTransferts = new Group();
Texture backgroundTexture = superflu.manager.get("images/fond_carte.png", Texture.class);
TextureRegion backgroundTextureRegion = new TextureRegion(backgroundTexture, VIRTUAL_WIDTH, VIRTUAL_HEIGHT);
Image imgBackground = new Image(backgroundTextureRegion);
imgBackground.touchable = false;
stage.addActor(imgBackground);
Texture carteTexture = superflu.manager.get("images/carte.png", Texture.class);
TextureRegion carteTextureRegion = new TextureRegion(carteTexture, VIRTUAL_WIDTH, VIRTUAL_HEIGHT);
Image carte = new Image(carteTextureRegion);
carte.touchable = false;
stage.addActor(carte);
stage.addActor(groupZones);
stage.addActor(groupVilles);
stage.addActor(groupTransferts);
stage.addActor(TransfertCreator.getInstance());
Music softMusic = superflu.manager.get("music/soft.mp3", Music.class);
softMusic.play();
createEntities();
Gdx.input.setInputProcessor(stage);
stage.addActor(new GlobalStatsActor(gameLogic));
}
public static GameScreen getInstance() {
if (instance == null) {
instance = new GameScreen();
}
return instance;
}
@Override
public void resume() {
}
@Override
public void resize(int width, int height) {
stage.setViewport(VIRTUAL_WIDTH, VIRTUAL_HEIGHT, false);
stage.getCamera().position.set(VIRTUAL_WIDTH/2, VIRTUAL_HEIGHT/2, 0);
}
@Override
public void render(float delta) {
GL10 gl = Gdx.graphics.getGL10();
// Update model
gameLogic.update((int)(delta*1000.0f));
// clear previous frame
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
stage.act(delta);
stage.draw();
}
public GameLogic getGameLogic() {
return gameLogic;
}
@Override
public void pause() {
}
@Override
public void dispose() {
stage.dispose();
}
@Override
public void hide() {
// TODO Auto-generated method stub
}
@Override
public void show() {
// TODO Auto-generated method stub
}
private void createEntities() {
gameLogic = new GameLogic();
Carte carte = new Carte(gameLogic);
gameLogic.setCarte(carte);
for (int i = 1; i <= 6; i++) {
Zone zone = createZone(i);
groupZones.addActor(new ZoneActor(zone));
carte.addZone(zone);
}
}
private Zone createZone(int id) {
final String nom; // Nom de la zone;
final String filepath = "zones/zone" + id + ".data";
boolean first = true;
try {
BufferedReader buff = Gdx.files.internal(filepath).reader(1024);
String line;
nom = buff.readLine();
// Creation de la zone.
Zone zone = new Zone(id, nom);
while ((line = buff.readLine()) != null) {
String tab[] = line.split(" ");
if (tab.length == 3) {
tab[0] = tab[0].replace('_', ' ');
if (first) {
Usine usine = new Usine(zone, tab[0],
Integer.valueOf(tab[1]),
Integer.valueOf(tab[2]));
groupVilles.addActor(new VilleActor(usine));
zone.addVille(usine);
first = false;
} else {
Ville ville = new Ville(zone, tab[0],
Integer.valueOf(tab[1]),
Integer.valueOf(tab[2]));
groupVilles.addActor(new VilleActor(ville));
zone.addVille(ville);
}
} else {
System.err.println("Erreur lecture " + filepath
+ "continue quand même...");
}
}
buff.close();
return zone;
} catch (FileNotFoundException e) {
System.err.println("Fichier " + filepath
+ " introuvable ! Aucune ville chargée pour cette zone.");
} catch (IOException e) {
System.err.println("Erreur à la lecture de " + filepath + ".");
}
return null;
}
public Group getGroupZones() {
return groupZones;
}
public Group getGroupVilles() {
return groupVilles;
}
public void addTransfert(TransfertActor actor) {
groupTransferts.addActor(actor);
}
public void removeTransfert(TransfertActor actor) {
groupTransferts.removeActor(actor);
}
}