1

I'm currently developing a simple multiplayer game with Slick2D in Java. It's going to be a little more complex with the menu structure because I need several textfields to get the information which server address to connect, how many players are allowed to play, nickname and so on.

I reproduced my problem in 3 classes: The main class (ExampleGame) extends from StateBasedGame, Play and Menu from BasicGameState.

The classes Play and Menu have each one textfield and one button. My problem is I can only type in one of these classes into a textfield. The other textfield doesn't show any cursor responses when you click into the textfield.

This is the main class ExampleGame:

public class ExampleGame extends StateBasedGame  {

public static final int MAIN_MENU_STATE = 0;
public static final int GAME_PLAY_STATE = 1;

public ExampleGame(String name) {
    super(name);

    this.addState(new Menu(MAIN_MENU_STATE));
this.addState(new Play(GAME_PLAY_STATE));

this.enterState(MAIN_MENU_STATE);
}

/**
 * @param args
 */
public static void main(String[] args) {
     AppGameContainer appgc;
 try{
    appgc = new AppGameContainer(new ExampleGame("ExampleGame"));
    appgc.setDisplayMode(640, 360, false);
    appgc.setTargetFrameRate(50);
    appgc.start();
 }catch(SlickException e){
    e.printStackTrace();
 }
}

@Override
public void initStatesList(GameContainer arg0) throws SlickException {
    // TODO Auto-generated method stub
    this.getState(GAME_PLAY_STATE);
    this.getState(MAIN_MENU_STATE);


System.out.println(this.getStateCount() + ", " + this.getCurrentStateID());
this.enterState(MAIN_MENU_STATE);
}

}

ExampleGame automatically calls the MainMenu (Menu.java):

public class Menu extends BasicGameState {

private int stateID;
private Image background;
private UnicodeFont font;
private TextField textfield;
private Image createGameOption;
private int menuX = 50;
private int menuY = 250;


public Menu(int stateID) {
    this.stateID = stateID;
}


@Override
public void init(GameContainer arg0, StateBasedGame arg1) throws SlickException {

    System.out.println("StateID: " + arg1.getState(this.getID()) + " , State: " + arg1.getCurrentState());

    background = new Image("images/background_1024x640_v1.jpg");
    createGameOption = new Image("images/btn_CreateGame_for_1024x640_v1.png");

    textfield = new TextField(arg0, arg0.getDefaultFont(), 100, 100, 200, 30);
}


@Override
public void render(GameContainer arg0, StateBasedGame arg1, Graphics arg2) throws SlickException {
    // TODO Auto-generated method stub
    background.draw(0, 0);
    createGameOption.draw(menuX, menuY);
    textfield.render(arg0, arg2);

}


@Override
public void update(GameContainer arg0, StateBasedGame arg1, int arg2) throws SlickException {

    Input input = arg0.getInput();

    int mouseX = input.getMouseX();
    int mouseY = input.getMouseY();

    // if mouse is over a button
    if ((mouseX >= menuX && mouseX <= menuX + createGameOption.getWidth()) && (mouseY >= menuY && mouseY <= menuY + createGameOption.getHeight())) {

        if (input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON)) {
            // fx.play();
            arg1.enterState(ExampleGame.GAME_PLAY_STATE);
        }

    }

}


@Override
public int getID() {
    // TODO Auto-generated method stub
    return stateID;
}

}

Here I can write in the textfield. So far so good. By clicking on the button I call the next page (Play.java):

public class Play extends BasicGameState {

private int stateID;
private Image background;
private UnicodeFont font;
private TextField textfield;
private Image createGameOption;
private int menuX = 350;
private int menuY = 250;


public Play (int stateID) {
    this.stateID = stateID;
}

@Override
public void init(GameContainer arg0, StateBasedGame arg1) throws SlickException {

    System.out.println("StateID: " + arg1.getCurrentStateID() + " , State: " + arg1.getCurrentState());
    arg1.inputStarted();

    background = new Image("images/background_1024x640_v1.jpg");
    createGameOption = new Image("images/btn_CreateGame_for_1024x640_v1.png");

    textfield = new TextField(arg0, arg0.getDefaultFont(), 150, 100, 200, 30);
}

@Override
public void render(GameContainer arg0, StateBasedGame arg1, Graphics arg2) throws SlickException {
    // TODO Auto-generated method stub
    background.draw(0,0);
    createGameOption.draw(menuX, menuY);
    textfield.render(arg0, arg2);
}

@Override
public void update(GameContainer arg0, StateBasedGame arg1, int arg2) throws SlickException {

    Input input = arg0.getInput();

    int mouseX = input.getMouseX();
    int mouseY = input.getMouseY();

    if ((mouseX >= menuX && mouseX <= menuX + createGameOption.getWidth()) 
            && (mouseY >= menuY && mouseY <= menuY + createGameOption.getHeight())) {

        if (input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON)) {
            arg1.enterState(ExampleGame.MAIN_MENU_STATE);
        }
    }
}

@Override
public int getID() {
    // TODO Auto-generated method stub
    return stateID;
}

}

The class Play has almost the same code as Menu but it seems that the textfield in Play doesn't response to the mouse and key. It seems to be inactive because you can't see any changes. But that's actually not true. If I click in the textfield, type something and go back to the Menu by clicking the button, you can see the text you typed in. It seems that both textfields (the one from Menu and from Play) are connected to somehow. But I have no idea where the problem is from.

Has anyone any suggestions how I can fix that?

Thanks in advance!

user1885888
  • 135
  • 5
  • 13

1 Answers1

0

Slick TextField not working

This is the exact answer you're looking for that I answered not too long ago. This user had the same problem as you, and resolved it by following my wiki link by example of how to use StateBasedGame's

Community
  • 1
  • 1
Samich
  • 579
  • 4
  • 13
  • Are you certain it's the same issue? I tried changing my SBG to the way you suggest, but it was already fairly similar. And no dice. Is Slick2d actually able to handle more than one textfield? – AAAton May 08 '14 at 14:58