2

ゲームの作成に GridWorld (AP コンピューター サイエンス カリキュラムから) を使用しようとしていますが、複数のグリッドの使用に問題があります。World の setGrid メソッドが機能していないようです。私は、複数のグリッド オブジェクトを共存させることができ、World が指している現在のオブジェクトが GUI に描画されるという印象を受けました。しかし、それは起こりません... World の setGrid を呼び出してグリッドを渡すと、グリッドは論理的にのみ設定されているように見え、それを System.out.printing すると、アクターとその現在の位置の正しい結果が得られますが、 GUI が更新されず、グリッドが実際に表示されません。

これを説明するために、簡単な ActorWorld を書きました。

public static void main(String[] args) throws Exception
{
            ActorWorld x = new ActorWorld()
            {
                    Grid<Actor> gr1 = new BoundedGrid<Actor>(10,10);
                    Grid<Actor> gr2 = new BoundedGrid<Actor>(10,10);


                    public void step()
                    {
                            new Actor().putSelfInGrid(gr1, new Location(1,1));
                            new Actor().putSelfInGrid(gr2, new Location(9,9));
                            if (getGrid() == gr2)
                                    setGrid(gr1);
                            else
                                    setGrid(gr2);
                            System.out.println(getGrid());
                    }
            };
            x.show();
}

すべてのステップで別のグリッドに変更して表示する必要があるため、基本的に、グリッド内の 1 つのアクタの位置を (1,1) から (9,9) に変更する必要があります。しかし実際には、空のグリッドが表示されるだけです (これは、デフォルトのコンストラクターで作成した元のグリッドを使用しているためです。これは、提供しなかったためです)。どうしたの?現在のグリッドを描画するにはどうすればよいですか?

4

1 に答える 1

3

さて、私は問題を見つけました。gridworld の作成者に電子メールを送信したところ、彼はこれがバグであることを明らかにしました。

ソースコードを見つけて行を追加しました

display.setGrid(world.getGrid());

WorldFrame の repaint() メソッドの先頭まで。問題は、WorldFrame 自体が現在のグリッドを更新するため、論理的には正しいグリッドにありますが、実際にはグリッドが描画される JPanel であるWorldFrame の GridPanel オブジェクトであるdisplayは、塗り直します。これで、完全な方法は

public void repaint()
{
    display.setGrid(world.getGrid());
    String message = getWorld().getMessage();
    if (message == null)
        message = resources.getString("message.default");
    messageArea.setText(message);
    messageArea.repaint();
    display.repaint(); // for applet
    super.repaint();
}

そしてすべてが順調です。:)

于 2011-11-13T00:36:25.567 に答える