Алгоритм перемещения в GridWorld

В кейсе мира сетки для моего последнего проекта я делаю игру. В игре, если игрок нажимает клавишу «W», вызывается метод shiftUp(), который заставляет всех других актеров определенного экземпляра двигаться вниз, чтобы создать иллюзию движения игрока. Это не законченная реализация метода, но она должна получить всех актеров в сетке и проверить, являются ли они экземплярами класса с именем Enemy, который расширяет Actor. Если это так, актер должен переместиться на одну позицию вверх. Когда я вызываю этот метод, NullPointerException вызывается в строке, которая вызывает вражеский.moveTo(...); Этого не должно происходить, потому что я проверяю, является ли оно нулевым. Кто-нибудь может мне с этим помочь? Я получаю это: Исключение в потоке "AWT-EventQueue-0" java.lang.NullPointerException

public void shiftUp()
{
    if (((GameGrid)getGrid()).getMinX() != 0)
    {
        Grid<Actor> grid = getGrid();
        if (grid != null)
        {
            for (int y = 0; y < getGrid().getNumRows(); y++)
                for (int x = 0; x < getGrid().getNumCols(); x++)
                {
                    Actor enemy = grid.get(new Location(y,x));
                    if (enemy != null && enemy instanceof Enemy)
                        enemy.moveTo(new Location(enemy.getLocation().getRow() - 1, enemy.getLocation().getCol()));
                }
        }
    }
}

person Mobianhero    schedule 12.05.2012    source источник
comment
Какова полная трассировка стека исключения? Возможно ли, что getLocation() возвращает null?   -  person Jeffrey    schedule 12.05.2012
comment
Вот что он говорит: Исключение в потоке AWT-EventQueue-0   -  person Mobianhero    schedule 12.05.2012
comment
@Mobianhero, добавьте полную трассировку стека к своему вопросу, отредактировав его.   -  person Jeremy    schedule 12.05.2012
comment
ваше право по какой-то причине это getLocation(), который оказывается нулевым   -  person Mobianhero    schedule 12.05.2012
comment
@Mobianhero Что следует за этой строчкой? Это первая строка трассировки стека, оставшаяся ее часть сообщает нам, какие номера строк вызвали исключение.   -  person Jeffrey    schedule 12.05.2012
comment
он говорит: вызвал проблему   -  person Mobianhero    schedule 12.05.2012
comment
Я заменил все параметры реальными позициями в сетке, но это все равно не работает.   -  person Mobianhero    schedule 12.05.2012


Ответы (1)


Поскольку вы заранее проверяете enemy != null, я предполагаю, что enemy.getLocation() возвращает null, что вызывает NullPointerException при вызове null.getRow() и null.getCol().

Если это так, то, похоже, проблема в том, что вашему Actor никогда не присваивается правильный Location в сетке. Убедитесь, что вы используете метод putSelfInGrid(Grid<Actor> grid, Location loc) для размещения Actor в сетке (не grid.put(Location loc, E obj)), так как putSelfInGrid() соответственно устанавливает местоположение вашего Actor.

person Alex Lockwood    schedule 12.05.2012
comment
Все еще есть, даже после 3 лет бездействия GridWorld, да! :П - person Alex Lockwood; 12.05.2012