简体   繁体   中英

LibGDX - Sanity Check - Tiled Maps & The Player

everyone! This is my first post on StackOverflow, and I thought I might start off on the website with a desperate cry for assistance!

I'm currently making a game in LibGDX, and am trying to get my player to collide with a Tiled map, which I believe I've correctly initialized in the code.

However, my program is NullPointer-ing where it is trying to find the tileWidth and the tileHeight of the TiledMapLayer I specified.

I've been rolling this around in my head, but I can't seem to find a solution...

What am I doing wrong?

Here's my code:

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;
    }

...

class variable will be loaded before the constructor invoke, when accessing MetaLayer.getTileWidth() , MetaLayer not initialized and it is null. to solve the NPE modify the code like this

....
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();
}
....

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM