package beaver.game;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;
import org.newdawn.slick.Music;
public class MainMenuState extends BasicGameState {
// Initialize stateID to an "impossible" value
int stateID = -1;
// Initialize our menu images
Image bg = null;
Image start = null;
int startWidth;
int startHeight;
Image options = null;
int optionsWidth;
int optionsHeight;
Image exit = null;
int exitWidth;
int exitHeight;
// The scale of our menu images, because they get bigger when we hover over them
float startScale = 1;
float optionsScale = 1;
float exitScale = 1;
float scaleStep = 0.01f;
// Menu positioning
int startX;
int optionsX;
int exitX;
int menuTopAlign = 235;
int spacing = 100;
//Background music (not yet loaded)
private Music song = null;
MainMenuState(int stateID)
{
this.stateID = stateID;
}
@Override
public int getID() {
return stateID;
}
public void init(GameContainer gc, StateBasedGame sbg) throws SlickException {
bg = new Image("data/menu/menu.png");
start = new Image("data/menu/local.png");
startWidth = start.getWidth();
startHeight = start.getHeight();
startX = 400-(startWidth/2);
options = new Image("data/menu/network.png");
optionsWidth = options.getWidth();
optionsHeight = options.getHeight();
optionsX = 400-(optionsWidth/2);
exit = new Image("data/menu/quit.png");
exitWidth = exit.getWidth();
exitHeight = exit.getHeight();
exitX = 400-(exitWidth/2);
song = new Music("data/song.ogg");
}
// Start Music when we enter this state!
public void enter(GameContainer gc, StateBasedGame sbg) throws SlickException {
song.loop();
}
// Stop Music when we leave this state!
public void leave(GameContainer gc, StateBasedGame sbg) throws SlickException {
song.stop();
}
public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException {
bg.draw(0,0);
start.draw(startX, menuTopAlign, startScale);
options.draw(optionsX, menuTopAlign + spacing, optionsScale);
exit.draw(exitX, menuTopAlign + (2*spacing), exitScale);
}
public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException {
Input input = gc.getInput();
int mouseX = input.getMouseX();
int mouseY = input.getMouseY();
boolean insideStart = false;
boolean insideOptions = false;
boolean insideExit = false;
/* Handle case where the user hovers over the "Start Game" button */
if( (mouseX >= startX && mouseX <= startX + startWidth) &&
(mouseY >= menuTopAlign && mouseY <= menuTopAlign + startHeight) )
insideStart = true;
if(insideStart) {
// scale up by 5%
if(startScale < 1.05f)
startScale += scaleStep * delta;
// make button clickable
if ( input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON) ){
sbg.enterState(BeaversGame.GAMEPLAYSTATE);
}
}
else {
// once we move out of the "Start Game" box, scale back down to original size
if(startScale > 1.0f)
startScale -= scaleStep * delta;
}
/* Handle case where the user hovers over the "Options" button */
if( (mouseX >= optionsX && mouseX <= optionsX + optionsWidth) &&
(mouseY >= menuTopAlign+spacing && mouseY <= menuTopAlign+spacing + optionsHeight) )
insideOptions = true;
if(insideOptions) {
// scale up by 5%
if(optionsScale < 1.05f)
optionsScale += scaleStep * delta;
if ( input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON) ){
//If we click on "Network", then popup a "Is Host?" dialog
int isHost = JOptionPane.showConfirmDialog(null,
"Will you be hosting this game?",
"Choose one", JOptionPane.YES_NO_OPTION);
System.out.println(isHost);
boolean host = false;
if (isHost == 0) host = true;
System.out.println(host);
String ip = "localhost";
if(!host){
//Not host, no need for server
ip = (String)JOptionPane.showInputDialog(
"Enter IP address");
}
else{
// Start server
Runnable serv = new Runnable(){
public void run(){
GameServer s = new GameServer();
s.run();
}
};
new Thread(serv).start();
// Sleep current thread for a while, while server boots up
try {
Thread.sleep(5000);
}
catch (InterruptedException ie) {}
/*Thread t = new Thread(){
public void run(){
GameServer s = new GameServer();
s.run();
}
};*/
//t.start();
}
try{
sbg.addState(new ClientState(BeaversGame.CLIENTSTATE,ip));
sbg.getState(BeaversGame.CLIENTSTATE).init(gc, sbg);
sbg.enterState(BeaversGame.CLIENTSTATE);
}catch(Exception e){
JOptionPane.showMessageDialog(null,"An Error occured while establishing a connection");
sbg.enterState(BeaversGame.MAINMENUSTATE);
}
}
}
else {
// once we move out of the "Options" box, scale back down to original size
if(optionsScale > 1.0f)
optionsScale -= scaleStep * delta;
}
/* Handle case where the user hovers over the "Exit" button */
if( (mouseX >= exitX && mouseX <= exitX + exitWidth) &&
(mouseY >= menuTopAlign+2*spacing && mouseY <= menuTopAlign+2*spacing + exitHeight) )
insideExit = true;
if(insideExit) {
// scale up by 5%
if(exitScale < 1.05f)
exitScale += scaleStep * delta;
// make button clickable
if ( input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON) ){
gc.exit();
}
}
else {
// once we move out of the "Options" box, scale back down to original size
if(exitScale > 1.0f)
exitScale -= scaleStep * delta;
}
}
}