Android Game Dev - NullPointerException после объявления нового объекта (конструктор не делает то, что я хочу, чтобы он делал) - PullRequest
0 голосов
/ 28 июля 2011

В настоящее время я изучаю программирование игр, используя среду под названием libgdx.Это позволяет пользователям создавать программы, которые можно легко запускать как на виртуальной машине Java на настольном компьютере, так и на мобильном телефоне Android.Я пытаюсь создать простую программу, которая будет отображать символ на экране и позволит мне перемещать его вперед и назад с помощью клавиатуры.Я создал 3 класса - один с именем Assets, который загружает файлы в память и преобразует их в текстуры и анимации, один с именем InputHandler, который реагирует на ввод с клавиатуры путем изменения анимации, направления движения и т. Д., А другой называетсяFightView, что по сути и делает весь рендеринг.InputHandler вызывается из класса FightView с типичной командой input = new InputHandler(anim, frame);.Конструктор для InputHandler выглядит следующим образом:

public InputHandler(Animation animation, TextureRegion region){

    Assets.load();  //loads textures from files into memory and creates animations from them
    animation = Assets.playStance;  //set initial animation to be used
    region = animation.getKeyFrame(0, true);    //make TextureRegion equal to first frame in animation

}

Теперь, что я хочу, это просто, чтобы Animation и TextureRegion, переданные в конструктор, были установлены в значения, указанные выше, так что, например,, если бы я упомянул region в классе FightView после того, как input был объявлен, он будет установлен как animation.getKeyFrame(0, true);.Из моего ограниченного опыта Java это то, что я считаю, должно произойти, но я получаю исключение NullPointerException во время компиляции, указывающее на вторую строку в коде ниже:

    input = new InputHandler(anim, frame);
    x = centreX - (frame.getRegionWidth() / 2);

Ясно, что frame по-прежнему нулевой,даже после прохождения через конструктор, который (как видно из третьей строки в конструкторе) должен присвоить ему значение.Обратите внимание, что перед передачей в конструктор они оба фактически равны нулю - я пытаюсь создать класс, который будет предоставлять данные полей без необходимости делать это в классе FightView.

Любая помощь приветствуется.Это может быть неправильным путем - я пытаюсь создать объект, который при инициализации будет загружать Animation и TextureRegion s с данными.

1 Ответ

1 голос
/ 28 июля 2011

Проблема, с которой вы столкнулись, связана с неправильным пониманием базовой концепции Java. Java передает параметры по значению, а не по ссылке. То, что вы написали, никогда не будет работать так, как вы ожидаете.

Во-первых, я рекомендую вам, возможно, решить более простую проблему или пойти на попятную, чтобы усилить некоторые базовые концепции Java и концепции объектов.

Во-вторых, вот краткий ответ, чтобы достичь того, что вы хотите.

Добавление членов в класс InputHandler для хранения Animation и TextureRegion. В конструкторе (который не будет принимать параметров) вы должны присвоить значения, как вы сделали, за исключением того, что вы присваиваете их переменным-членам.

class InputHandler {

    public Animation animation;
    public TextureRegion region;

    public InputHandler() {

        Assets.load();  //loads textures from files into memory and creates animations from them
        animation = Assets.playStance;  //set initial animation to be used
        region = animation.getKeyFrame(0, true);    //make TextureRegion equal to first frame in animation

    }
}

После создания InputHandler вы можете ссылаться на его элементы (в данном случае на фрейме) и видеть ваши правильные значения.

input = new InputHandler();
x = centreX - (input.frame.getRegionWidth() / 2);
...