(GridWorld)世界的setGrid()没有正确重新绘制?

时间:2011-11-12 15:18:35

标签: java gridworld

我正在尝试使用GridWorld(来自AP计算机科学课程)制作游戏,而我在使用多个网格时遇到了问题。 World的setGrid方法似乎不起作用。我的印象是你可以有多个网格对象共存,并且世界指向的当前网格对象是在GUI中绘制的。但事实并非如此...当我调用World的setGrid并将其传递给网格时,网格似乎只能设置为LOGICAL,并且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)到(9,9)的网格改变位置中的一个Actor。但事实上,它只是显示一个空网格(因为它使用了它在默认构造函数中创建的原始网格,因为我没有提供一个)。 这是怎么回事?如何让它绘制当前网格?

1 个答案:

答案 0 :(得分:3)

好的,我发现了问题。通过电子邮件发送给gridworld的创建者,他透露这是一个错误。

我找到了源代码并添加了行

display.setGrid(world.getGrid());

到WorldFrame的repaint()方法的开头。问题是WorldFrame本身更新了它当前的Grid,所以逻辑上它就在右边,但是WorldFrame的GridPanel对象 display ,实际上是绘制网格的JPanel,不会被告知在重绘之前更新其网格。有了这个,完整的方法是

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();
}

一切都很好。 :)