(GridWorld) Мировой setGrid () не перерисовывается правильно? - PullRequest
2 голосов
/ 12 ноября 2011

Я пытаюсь использовать GridWorld (из учебного плана по информатике AP) для создания игры, и у меня возникают проблемы с использованием нескольких сеток.Мировой метод setGrid, похоже, не работает.У меня сложилось впечатление, что вы можете сосуществовать с несколькими объектами сетки, и что текущий, на который указывает Мир, - это объект, который рисуется в GUI.Но это не то, что происходит ... когда я вызываю setGrid Мира и передаю ему сетку, сетка, кажется, устанавливается только ЛОГИЧЕСКИ, и System.out.printing дает правильные результаты своих актеров и их текущих позиций, ноГрафический интерфейс не обновляется, и вы не можете видеть сетку.

Я написал простой 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).Но на самом деле, он просто отображает пустую сетку (потому что он использует оригинальную сетку, которую он сделал в конструкторе по умолчанию, поскольку я ее не предоставлял).В чем дело?Как мне заставить его нарисовать текущую сетку?

1 Ответ

3 голосов
/ 13 ноября 2011

Хорошо, я нашел проблему. По электронной почте создатель gridworld сообщил, что это ошибка.

Я нашел исходный код и добавил строку

display.setGrid(world.getGrid());

к началу метода repaint () WorldFrame. Проблема заключалась в том, что сам WorldFrame обновляет свой текущий Grid, поэтому логически он находится на правильном уровне, но объект GridPanel WorldFrame, 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();
}

и все хорошо. :)

...