1

カードゲームを作成しており、グラフィックに slick2d を使用しています。public void init でデッキからカードを引くメソッドを呼び出すと、2 回実行されます。以下のメソッドは、デッキ コンストラクターからカードを引き、インデックス番号を返します。

public Card PlayerCardDraw()
{

    Card index = cards.remove(1);
    System.out.println("Cards left: " + cards.size());
    return index;
}

デッキコンストラクター:

Deck()
{
    cards = new ArrayList<Card>();
    for (int a = 0; a < 52; a++)
    {           
            cards.add(new Card(a));         
    }
}
public class Play extends BasicGameState
{
Deck deck = new Deck ();
Image PlayScreen;
Image PauseButton;
Image FaceDown1, FaceDown2;

Image card[] = new Image [52];

public String mouse = "no input";


Card C;

public Play (int state)
{

}


public void init (GameContainer gc, StateBasedGame sbg) throws SlickException
{
    PlayScreen = new Image ("res/Play/PlayScreen.png");
    PauseButton = new Image ("res/Play/PauseButton.png");
    FaceDown1 = new Image("res/CardBacks/redback1.png");
    FaceDown2 = new Image("res/CardBacks/redback2.png");

    String fileLocation = new String ();
    for (int i = 0 ; i < 52 ; i++)
    {
        fileLocation = "res/cards/" + (i+1) + ".png";
        card [i] = new Image (fileLocation);
    }
       //should only run once, right?
    C = deck.PlayerCardDraw();

}

実行時に得られる出力は Cards left: 51 Cards left: 50 です

これは、PlayerCardDraw() が 2 回呼び出されたことを意味します。「こんにちは」という簡単なシステムアウトステートメントを追加したところ、2回も実行されました。

なぜこれが起こっているのか、それを修正する方法を知っている人はいますか? ちなみに、このようなものは、プログラムが再生状態に入る前に実行されています。これを含まないタイトル状態のカード left と hi を表示します。

4

1 に答える 1

1

これは非常に古い質問だと思いますが、まったく同じ問題があり、それを理解しました。私にとっては、StateBasedGameクラスのコンストラクターとinitStatesList()関数で画面を初期化していたということでした。これは私のコードでした:

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

    this.addState(new TitleScreen(TheGame.MENUSTATEID));
    this.addState(new HelpScreen(TheGame.HELPSTATEID));
    this.addState(new GameScreen(TheGame.PLAYSTATEID, GAMEWIDTH, GAMEHEIGHT));
    this.addState(new PauseScreen(TheGame.PAUSESTATEID));
    this.addState(new GameOverScreen(TheGame.GAMEOVERSTATEID));
    this.addState(new HighScoresScreen(TheGame.GAMERESULTSSTATEID));
}

public void initStatesList(GameContainer arg0) throws SlickException 
{
    this.getState(TheGame.MENUSTATEID).init(arg0, this);
    this.getState(TheGame.HELPSTATEID).init(arg0, this);
    this.getState(TheGame.PLAYSTATEID).init(arg0, this);
    this.getState(TheGame.PAUSESTATEID).init(arg0, this);
    this.getState(TheGame.GAMEOVERSTATEID).init(arg0, this);
    this.getState(TheGame.GAMERESULTSSTATEID).init(arg0, this);

    this.enterState(TheGame.MENUSTATEID);
}

これは私のコンピューター サイエンスの先生が私のクラスで教えた方法ですが、彼は Slick 2D に慣れていないので、単に間違いを犯しただけだと思います。getState()のすべての行を削除して修正しましたinitStatesList()。これがお役に立てば幸いです。

于 2017-01-13T00:25:14.357 に答える