/*
* AQP Project
* http://http://code.google.com/p/aqp-project/
* Alexandre Gomez - Clément Troesch - Fabrice Latterner
*/
package com.aqpproject.worldmodel.game.state;
import com.aqpproject.game.Singleton;
import com.aqpproject.sound.SoundController;
import com.aqpproject.tools.Vector2D;
import com.aqpproject.worldmodel.Control;
import com.aqpproject.worldmodel.GameState;
import com.aqpproject.worldmodel.game.WorldModelGame;
import com.aqpproject.worldmodel.game.entity.*;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import java.io.IOException;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.text.TextAction;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
/**
*
* @author Alexandre
*/
public class OptionsGameState implements GameState {
/**
* Constructor
*/
public OptionsGameState() {
m_initialized = false;
}
/**
* @see WorldModel#initialize()
*/
@Override
public void initialize() {
if (!m_initialized) { //If not initialized
System.out.append("test\ntest");
m_worldEntities = new HashMap<>();
m_worldTextEntities = new HashMap<>();
m_barsList = new HashMap<>();
try {
sc = Singleton.getAudioController();
Singleton.getVisualisation().loadSprites("config/mainmenu.xml");
} catch (ParserConfigurationException | SAXException | IOException ex) {
Logger.getLogger(MainMenuGameState.class.getName()).log(Level.SEVERE, null, ex);
}
m_position = 0;
m_lastInput = 0;
m_waitTime = 200;
m_soundDelay = 10;
m_resolution = Singleton.getVisualisation().getResolution();
m_decX = 1420;
m_decY = 1750;
m_minX = 1420 - m_resolution.x / 2;
m_minY = 1750 - m_resolution.y / 2;
m_menuX = 975 - m_minX;
m_stateTime = Singleton.getWorldModel().getTime();
m_loadingTime = 500;
m_menuWidth = Singleton.getVisualisation().getSpriteSize("bandeauY").x;
m_musicVolumeOrig = Singleton.getOptionsController().getMusicVolume();
m_fxVolumeOrig = Singleton.getOptionsController().getFXVolume();
m_musicVolume = (int) (m_musicVolumeOrig * 100);
m_fxVolume = (int) (m_fxVolumeOrig * 100);
createEntities();
//Initialisation
m_initialized = true;
}
}
/**
* @see WorldModel#destroy()
*/
@Override
public void destroy() {
//Entities
for (WorldEntity e : m_worldEntities.values()) {
e.destroy();
}
for (WorldTextEntity e : m_worldTextEntities.values()) {
e.destroy();
}
for (WEMenu e : m_barsList.values()) {
e.destroy();
}
}
/**
* Create the entities
*/
private void createEntities() {
Singleton.getVisualisation().createMap(Singleton.getWorldModel().getMaps().get("MapMenu").getPath());
Singleton.getVisualisation().setCameraPosition(1420, 1750);
m_worldEntities.put("bandeauY", new WEMenu("bandeauY", "bandeauY", new Vector2D(975, 1000), 0, 1));
float textWidth = calcWidth("Options", "ar30whi");
m_worldTextEntities.put("Title", new WEAlphaTextButton("Title", m_menuX + m_menuWidth / 2 - textWidth / 2, m_resolution.y - 50, "Options", "ar30whi"));
m_worldTextEntities.put("MusicVolume", new WEAlphaTextButton("MusicVolume", m_menuX + 50, m_resolution.y - 150, "Music Volume", "ar30whi"));
m_worldTextEntities.put("FXVolume", new WEAlphaTextButton("FXVolume", m_menuX + 50, m_resolution.y - 250, "FX Volume", "ar30whi"));
m_worldTextEntities.put("Accept", new WEAlphaTextButton("Accept", m_menuX + 50, m_resolution.y - 350, "Accept", "ar30whi"));
m_worldTextEntities.put("Cancel", new WEAlphaTextButton("Cancel", m_menuX + 50, m_resolution.y - 400, "Cancel", "ar30whi"));
//Texts initialization
((WEAlphaTextButton) m_worldTextEntities.get("MusicVolume")).m_setMInitialize(true);
((WEAlphaTextButton) m_worldTextEntities.get("FXVolume")).m_setMInitialize(true);
((WEAlphaTextButton) m_worldTextEntities.get("Accept")).m_setMInitialize(true);
((WEAlphaTextButton) m_worldTextEntities.get("Cancel")).m_setMInitialize(true);
((WEAlphaTextButton) m_worldTextEntities.get("MusicVolume")).setSelect(true);
//Arrows
m_worldEntities.put("arrow_music_volume", new WEMenu("arrow_music_volume", "arrow", new Vector2D(m_minX + m_menuX + 10, m_resolution.y + m_minY - 178), 0, 1));
m_worldEntities.put("arrow_fx_volume", new WEMenu("arrow_fx_volume", "arrow", new Vector2D(m_minX + m_menuX + 10, m_resolution.y + m_minY - 278), 0, 2));
m_worldEntities.put("arrow_accept", new WEMenu("arrow_accept", "arrow", new Vector2D(m_minX + m_menuX + 10, m_resolution.y + m_minY - 378), 0, 2));
m_worldEntities.put("arrow_cancel", new WEMenu("arrow_cancel", "arrow", new Vector2D(m_minX + m_menuX + 10, m_resolution.y + m_minY - 428), 0, 2));
//Speakers
m_worldEntities.put("speaker_music", new WEMenu("speaker_music", "speaker", new Vector2D(m_minX + m_menuX + 50, m_resolution.y + m_minY - 228), 0, 1));
m_worldEntities.put("speaker_fx", new WEMenu("speaker_fx", "speaker", new Vector2D(m_minX + m_menuX + 50, m_resolution.y + m_minY - 328), 0, 1));
//Barre de volume musique
int i = 1;
m_barsList.put("music_bar" + i, new WEMenu("music_bar" + i, "bar_left", new Vector2D(m_minX + m_menuX + 100, m_resolution.y + m_minY - 228), 0, 1));
for (i = 2; i < 100; i++) {
m_barsList.put("music_bar" + i, new WEMenu("music_bar" + i, "bar", new Vector2D(m_minX + m_menuX + 100 + i * 2, m_resolution.y + m_minY - 228), 0, 1));
}
m_barsList.put("music_bar" + i, new WEMenu("music_bar" + i, "bar_right", new Vector2D(m_minX + m_menuX + 300, m_resolution.y + m_minY - 228), 0, 1));
//Barre de volume fx
i = 1;
m_barsList.put("fx_bar" + i, new WEMenu("fx_bar" + i, "bar_left", new Vector2D(m_minX + m_menuX + 100, m_resolution.y + m_minY - 328), 0, 1));
for (i = 2; i < 100; i++) {
m_barsList.put("fx_bar" + i, new WEMenu("fx_bar" + i, "bar", new Vector2D(m_minX + m_menuX + 100 + i * 2, m_resolution.y + m_minY - 328), 0, 1));
}
m_barsList.put("fx_bar" + i, new WEMenu("fx_bar" + i, "bar_right", new Vector2D(m_minX + m_menuX + 300, m_resolution.y + m_minY - 328), 0, 1));
updateBars();
}
/**
* @see WorldModel#update()
*/
@Override
public void update() {
if (m_initialized) {
((WEAlphaTextButton) m_worldTextEntities.get("MusicVolume")).setSelect(m_position == 0 ? true : false);
((WEAlphaTextButton) m_worldTextEntities.get("FXVolume")).setSelect(m_position == 1 ? true : false);
((WEAlphaTextButton) m_worldTextEntities.get("Accept")).setSelect(m_position == 2 ? true : false);
((WEAlphaTextButton) m_worldTextEntities.get("Cancel")).setSelect(m_position == 3 ? true : false);
Singleton.getVisualisation().updateActorFrame("arrow_music_volume", m_position == 0 ? 1 : 2);
Singleton.getVisualisation().updateActorFrame("arrow_fx_volume", m_position == 1 ? 1 : 2);
Singleton.getVisualisation().updateActorFrame("arrow_accept", m_position == 2 ? 1 : 2);
Singleton.getVisualisation().updateActorFrame("arrow_cancel", m_position == 3 ? 1 : 2);
Singleton.getVisualisation().updateActorFrame("speaker_music", m_musicVolume == 0 ? 2 : 1);
Singleton.getVisualisation().updateActorFrame("speaker_fx", m_fxVolume == 0 ? 2 : 1);
long time = Singleton.getWorldModel().getTime();
for (WorldTextEntity e : m_worldTextEntities.values()) {
e.update(time);
}
}
}
/**
* @see WorldModel#controlEntity(java.lang.String,
* com.aqpproject.worldmodel.Control)
*/
@Override
public void control(Control control) {
if (Singleton.getWorldModel().getTime() - m_stateTime > m_loadingTime) {
if (control == Control.SPACE) {
Singleton.getWorldModel().setNextState(new RaceGameState());
}
if (control == Control.UP && m_lastInput + m_waitTime < Singleton.getWorldModel().getTime()) {
m_position--;
sc.playSound("ding", false);
if (m_position < 0) {
m_position = 3;
}
m_lastInput = Singleton.getWorldModel().getTime();
}
if (control == Control.DOWN && m_lastInput + m_waitTime < Singleton.getWorldModel().getTime()) {
m_position++;
sc.playSound("ding", false);
if (m_position > 3) {
m_position = 0;
}
m_lastInput = Singleton.getWorldModel().getTime();
}
if (control == Control.LEFT && m_lastInput + m_soundDelay < Singleton.getWorldModel().getTime()) {
switch (m_position) {
case 0:
m_musicVolume--;
if (m_musicVolume < 0) {
m_musicVolume = 0;
}
Singleton.getOptionsController().setMusicVolume(((float) m_musicVolume) / 100);
break;
case 1:
m_fxVolume--;
if (m_fxVolume < 0) {
m_fxVolume = 0;
}
Singleton.getOptionsController().setFXVolume(((float) m_fxVolume) / 100);
break;
}
updateBars();
m_lastInput = Singleton.getWorldModel().getTime();
}
if (control == Control.RIGHT && m_lastInput + m_soundDelay < Singleton.getWorldModel().getTime()) {
switch (m_position) {
case 0:
m_musicVolume++;
if (m_musicVolume > 100) {
m_musicVolume = 100;
}
Singleton.getOptionsController().setMusicVolume(((float) m_musicVolume) / 100);
break;
case 1:
m_fxVolume++;
if (m_fxVolume > 100) {
m_fxVolume = 100;
}
Singleton.getOptionsController().setFXVolume(((float) m_fxVolume) / 100);
break;
}
updateBars();
m_lastInput = Singleton.getWorldModel().getTime();
}
if (control == Control.ESCAPE) {
Singleton.getOptionsController().setFXVolume(m_fxVolumeOrig);
Singleton.getOptionsController().setMusicVolume(m_musicVolumeOrig);
Singleton.getWorldModel().setNextState(new MainMenuGameState());
}
if (control == Control.ENTER) {
switch (m_position) {
case 2:
Singleton.getWorldModel().setNextState(new MainMenuGameState());
break;
case 3:
Singleton.getOptionsController().setFXVolume(m_fxVolumeOrig);
Singleton.getOptionsController().setMusicVolume(m_musicVolumeOrig);
Singleton.getWorldModel().setNextState(new MainMenuGameState());
break;
}
}
}
}
@Override
public void control(Control control, String entity) {
throw new UnsupportedOperationException("Not supported yet.");
}
/**
* @see WorldModel#updateActorTransform()
*/
@Override
public void updateActorTransform() {
//Entities
for (WorldEntity e : m_worldEntities.values()) {
e.updateActorTransform();
}
}
/**
* @see WorldModel#saveEntitiesState()
*/
@Override
public void saveEntitiesState() {
/*
* for (WorldEntity e : m_worldEntities.values()) { e.saveTransform(); }
*
*/
}
@Override
public boolean isInitialized() {
return m_initialized;
}
@Override
public void startContact(String firstEntity, String secondEntity, Vector2D normal, Vector2D point) {
}
@Override
public void stopContact(String firstEntity, String secondEntity, Vector2D normal, Vector2D point) {
}
public void addTextEntity(String name, WorldTextEntity entity) {
m_worldTextEntities.put(name, entity);
}
public float calcWidth(String s, String font) {
BitmapFont myFont = new BitmapFont(Gdx.files.internal("data/font/" + font + ".fnt"), Gdx.files.internal("data/font/" + font + ".png"), false); //TODO: change the font/size
float res = myFont.getBounds(s).width;
return res;
}
public void updateBars() {
for (int i = 1; i <= 100; i++) {
System.out.println(i);
Singleton.getVisualisation().updateActorFrame("music_bar" + i, i < m_musicVolume + 1 ? 2 : 1);
Singleton.getVisualisation().updateActorFrame("fx_bar" + i, i < m_fxVolume + 1 ? 2 : 1);
}
}
@Override
public HashMap<String, WorldEntity> getWorldEntities() {
return m_worldEntities;
}
/////////////////////////////////////////
// Attributes
/////////////////////////////////////////
protected HashMap<String, WorldEntity> m_worldEntities;
protected HashMap<String, WorldTextEntity> m_worldTextEntities;
protected HashMap<String, WEMenu> m_barsList;
protected boolean m_initialized;
protected int m_position;
protected long m_lastInput;
protected long m_waitTime;
protected long m_stateTime;
protected long m_loadingTime;
protected SoundController sc;
protected float m_minX;
protected float m_minY;
protected float m_menuX;
protected float m_menuWidth;
protected int m_decX;
protected int m_decY;
protected boolean m_isUpdating;
protected Vector2D m_resolution;
protected int m_fxVolume;
protected int m_musicVolume;
protected float m_soundDelay;
protected float m_fxVolumeOrig;
protected float m_musicVolumeOrig;
}