2015-03-24 3 views
0

Я начал пытаться создать TestGame. В настоящее время есть NPE и после того, как трачу часы на Google и пытаюсь все, о чем я мог думать, я не могу понять, что я забываю или забываю. У меня было все в одном классе, и все отлично работало. Хотя я хотел создать графический интерфейс, где я мог переключаться между MainMenu и PlayScreen. Мой класс MainMenu работает отлично, хотя, когда я ударил аккуратную кнопку «играть», чтобы войти в класс экране воспроизведения я получаю эти ошибки:Libgdx Screen NullPointerException при переключении экранов

Exception in thread "LWJGL Application" java.lang.NullPointerException 
at com.me.game.PlayScreen.render(PlayScreen.java:90) 
at com.badlogic.gdx.Game.render(Game.java:46) 
at com.me.game.TestGame.render(TestGame.java:27) 
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:214) 
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120) 

экране воспроизведения ошибки:

batch.draw(player.getCurrentFrame(), player.getPosition().x , player.getPosition().y); 

ошибка игры:

if (screen != null) screen.render(Gdx.graphics.getDeltaTime()); 

ошибка TestGame:

super.render(); 

TestMenu класс (класс Game)

public class TestGame extends Game { 

Game game; 

@Override 
public void create() { 
    game = this; 
    setScreen(new MainMenu(game)); 

public void render() { 
    super.render(); 
} 

MainMenu класс

public class MainMenu implements Screen{ 

SpriteBatch batch; 
Game game; 
Stage stage; 

public MainMenu(Game game){ 
    this.game = game; 

public void render(float delta) { 
    Gdx.gl.glClearColor(1, 1, 1, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    stage.act(); 

    batch.begin(); 
    stage.draw(); 
    batch.end(); 

} 

public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { 
        game.setScreen(new PlayScreen(game)); 
        stage.clear(); 
         return true; 

экране воспроизведения
public class PlayScreen implements Screen { 

SpriteBatch batch; 
Player player; 
Game game; 
Texture playerTexture; 

     public PlayScreen(Game game){ 
     this.game = game; 

    } 

public void render(float delta) { 

     Gdx.gl.glClearColor(1, 1, 1, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

     batch.begin(); 

     batch.draw(player.getCurrentFrame(), player.getPosition().x , player.getPosition().y); 

     } 

     player.update(); 

     batch.end(); 

} 

public void show() {       
     batch = new SpriteBatch(); 

класс игрока

public class Player { 
Texture playerTexture ; 
Vector2 position; 
String textureLoc; 

public Player(Vector2 position, String textureLoc){ 
      this.position = position;     
      movement = ""; 

      playerTexture = new Texture(Gdx.files.internal("Character.png")); 

public String getTextureLoc() { 
     return textureLoc; 
    } 

    public void setTextureLoc(String textureLoc) { 
     this.textureLoc = textureLoc; 
    } 

Самым полезным было Libgdx Screen NullPointerException when referencing another class, где эта проблема также, кажется, что я не инициализировать игрока в классе PlayerScreen в методе шоу. Хотя когда я заполняю player = new Player (position, textureLoc); в рамках шоу метода

public void show() {       
     batch = new SpriteBatch(); 
     player = new Player(position, textureLoc); 

получить другие ошибки

at com.me.game.Player.<init>(Player.java:50) 
at com.me.game.PlayScreen.show(PlayScreen.java:90) 
at com.badlogic.gdx.Game.setScreen(Game.java:61) 
at com.me.game.MainMenu$1.touchDown(MainMenu.java:90) 

Какой пункт:

bounds = new Rectangle(position.x, position.y, currentFrame.getRegionWidth(), currentFrame.getRegionHeight()); 

player = new Player(position, textureLoc); 

game.setScreen(new PlayScreen(game)); 

Хотя я предполагаю, что это имеет какое-то отношение к игроку не инициализируется правильно? Во всяком случае по какой-то причине я просто не могу решить эту проблему. Любые идеи очень приветствуются.

ответ

0

Проблема прямо здесь

player = new Player(position, textureLoc); 

положение и textureLoc заполнители, эти параметры вы создали следующие

Vector2 position, String textureLoc 

Это означает, что необходимо создать новую Vector2 и разместить его там, где положение is и String и поместите его там, где textureLoc.

Вместо этого попробуйте использовать следующий код, который поместит игрока примерно в середину экрана.

player = new Player(new Vector2(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2), "I am not sure why you put this parameter here"); 
+0

Я знал, что это что-то простое, не верю, что я этого не осознавал. Ты мой герой дня! Спасибо за ваш ясный и быстрый ответ, если бы у меня был необходимый представитель, я бы проголосовал за ваш ответ! :). Вы не представляете, как вы меня просто счастливы. –

Смежные вопросы