简体   繁体   English

LibGDX-健全性检查-平铺的地图和播放器

[英]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! 这是我在StackOverflow上的第一篇文章,我想我可能会在网站上开始大声疾呼寻求帮助!

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. 我目前正在用LibGDX制作游戏,并试图让我的玩家与Tiled地图碰撞,我相信我已经在代码中正确初始化了。

However, my program is NullPointer-ing where it is trying to find the tileWidth and the tileHeight of the TiledMapLayer I specified. 但是,我的程序是NullPointer-ing,它试​​图查找我指定的TiledMapLayer的tileWidth和tileHeight。

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. 在访问MetaLayer.getTileWidth() ,将在constructor调用之前加载class变量, MetaLayer初始化MetaLayer.getTileWidth() ,该MetaLayer为null。 to solve the NPE modify the code like this 解决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();
}
....

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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