2015-05-28 4 views
0

все! Это мой первый пост в StackOverflow, и я подумал, что могу начать с сайта с отчаянным криком о помощи!LibGDX - Проверка соответствия - Плиточные карты и плеер

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

Однако моя программа NullPointer-ing, где она пытается найти tileWidth и tileHeight указанного TiledMapLayer.

Я катится этот в моей голове, но я не могу найти решение ...

Что я делаю неправильно?

Вот мой код:

public class PlayScreen implements Screen{ 

    EscapeGame game; 
    Player player; 

    OrthographicCamera cam; 
    private TiledMap prototype; 
    private OrthogonalTiledMapRenderer renderer; 
    private SpriteBatch batch; 
    Texture playerTexture; 


    public PlayScreen(EscapeGame game){ 
     this.game = game; 
    } 

    @Override 
    public void show() { 
     float w = Gdx.graphics.getWidth(); 
     float h = Gdx.graphics.getHeight(); 

     TmxMapLoader tmx = new TmxMapLoader(); 

     prototype = new TmxMapLoader().load("maps/Prototype2.tmx"); 
     renderer = new OrthogonalTiledMapRenderer(prototype); 
     cam = new OrthographicCamera(); 
     batch = new SpriteBatch(); 
     playerTexture = new Texture("Sprites/prototagonist1.png"); 

     player = new Player(new Sprite(playerTexture), (TiledMapTileLayer) prototype.getLayers().get("MetaLayer")); 

     player.setPosition(7 * player.getMeta().getTileWidth(), 11 * player.getMeta().getTileHeight()); 

    } 

... 


public class Player extends Sprite { 

    float gravity = 360 * 3.5f; 

    public Vector2 velocity; 

    private TiledMapTileLayer MetaLayer; float oldY = getY(), oldX = getX(), tileWidth = MetaLayer.getTileWidth(), tileHeight = MetaLayer.getTileHeight(); 


//getters and setters 

    public Player (Sprite sprite, TiledMapTileLayer Meta){ 
     super(sprite); 
     this.MetaLayer = MetaLayer; 
    } 

    public TiledMapTileLayer getMeta() { 
     return MetaLayer; 
    } 

    public void setMeta(TiledMapTileLayer Meta) { 
     this.MetaLayer = MetaLayer; 
    } 

... 
+0

Какая линия бросает 'NPE'? – ssantos

+0

Он бросает NPE в «tileWidth = MetaLayer.getTileWidth()». – Ralphanese

+0

Ну, вы не назначаете MetaLayer в любое время, поэтому его значение равно null. – ssantos

ответ

0

переменная класса будет загружен до constructor Invoke, при доступе к MetaLayer.getTileWidth(), MetaLayer не инициализирован и является недействительным. для решения NPE изменить код, подобный этому

.... 
private TiledMapTileLayer MetaLayer; 
float oldY, oldX, tileWidth, tileHeight; 

public Player (Sprite sprite, TiledMapTileLayer Meta){ 
    super(sprite); 
    this.MetaLayer = Meta; 

    tileWidth = MetaLayer.getTileWidth(); 
    tileHeight = MetaLayer.getTileHeight(); 

    /** Recommended **/ 
    oldY = getY(); 
    oldX = getX(); 
} 
....