1

私は現在、Java で Slick2D を使用して単純なマルチプレイヤー ゲームを開発しています。接続するサーバーアドレス、プレイできるプレイヤー数、ニックネームなどの情報を取得するためにいくつかのテキストフィールドが必要なので、メニュー構造はもう少し複雑になります。

ExampleGame私は自分の問題を 3 つのクラスで再現StateBasedGamePlayましMenuBasicGameState

クラスPlayMenuは、それぞれ 1 つのテキストフィールドと 1 つのボタンがあります。私の問題は、これらのクラスの 1 つしかテキストフィールドに入力できないことです。テキストフィールドをクリックしても、他のテキストフィールドにはカーソル応答が表示されません。

これはメインクラスの 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 は 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;
}

}

ここで、テキストフィールドに書き込むことができます。ここまでは順調ですね。ボタンをクリックして、次のページ (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;
}

}

クラスPlayはほぼ同じコードMenuですが、テキストフィールドがPlayマウスとキーに反応しないようです。変化が見られないため、非アクティブのようです。しかし、実際にはそうではありません。テキストフィールドをクリックして何かを入力し、ボタンをクリックしてメニューに戻ると、入力したテキストが表示されます。両方のテキストフィールド (メニューからのものと からのものPlay) が何らかの形で接続されているようです。しかし、どこに問題があるのか​​ わかりません。

どうすればそれを修正できるか、誰か提案がありますか?

前もって感謝します!

4

1 に答える 1

0

スリックテキストフィールドが機能しない

これは、私が少し前に答えた、あなたが探している正確な答えです。このユーザーはあなたと同じ問題を抱えていて、StateBasedGame の使用方法の例で私の wiki リンクをたどって解決しました。

于 2014-02-20T02:56:12.770 に答える