2017-06-16 22 views
0

何らかの理由でGdx.graphics.getDeltaTime()をプレーヤークラスに渡そうとすると、floatのデルタ時間がnullになり、nullポインタの例外が発生します。私はすでにgetDeltaTimeメソッドが機能しているかどうか、そしてカウントしているかどうかをチェックしようとしましたが、関数を渡そうとすると機能しません。getDeltaTime()メソッドがnullを返す例外?

私のメインのコード

 public class MyGdxGame extends ApplicationAdapter implements InputProcessor { 

SpriteBatch batch; 
private Player1 player1; 
private TiledMap iceLevel; 
private OrthogonalTiledMapRenderer renderer; 
private OrthographicCamera camera; 
float elaspedTime; 

@Override 
public void create() { 
    batch = new SpriteBatch(); 
    Gdx.input.setInputProcessor(this); 

    TmxMapLoader loader = new TmxMapLoader(); 
    iceLevel = loader.load("IceLevel.tmx"); 
    renderer = new OrthogonalTiledMapRenderer(iceLevel); 
    camera = new OrthographicCamera(); 
    camera.setToOrtho(false); 

    player1 = new Player1(new Sprite(new Texture("player1Right.png")), (TiledMapTileLayer) iceLevel.getLayers().get("Land")); 
    player1.setPosition(player1.getCollisionLayer().getTileWidth(), 6 * player1.getCollisionLayer().getTileHeight()); 
} 

@Override 
public void render() { 
    player1.update(Gdx.graphics.getDeltaTime()); 

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

    camera.update(); 
    renderer.setView(camera); 
    renderer.render(); 

    renderer.getBatch().begin(); 

    player1.draw(renderer.getBatch()); 

    renderer.getBatch().end(); 

    batch.end(); 
} 

@Override 
public void dispose() { 
    batch.dispose(); 
    iceLevel.dispose(); 
    renderer.dispose(); 
    player1.getTexture().dispose(); 

} 

私のプレーヤーのクラスの一部は

public class Player1 extends Sprite implements InputProcessor { 

private Vector2 velocity; 

private float speed = 60 * 2; 
private float gravity = 60 * 1.8f; 
private TiledMapTileLayer collisionLayer; 

public Player1(Sprite sprite, TiledMapTileLayer collisionLayer) { 
    super(sprite); 
    this.collisionLayer = collisionLayer; 
} 

public void draw(SpriteBatch spriteBatch) { 
    update(Gdx.graphics.getDeltaTime()); 
    super.draw(spriteBatch); 
} 

public void update(float delta) { 

    //gravity 
    velocity.y -= gravity * delta; 

    //set limit 
    if (velocity.y > speed) { 
     velocity.y = speed; 

    } else if (velocity.y < -speed) { 
     velocity.y = -speed; 
    } 

    // save old position 
    float oldX = getX(); 
    float oldY = getY(); 
    boolean collisionX = false; 
    boolean collisionY = false; 

    // move on x 
    setX(getX() + velocity.x * delta); 

    if (velocity.x < 0) { //going left 
     collisionX = collidesLeft(); 
    } else if (velocity.x > 0) { //going right 
     collisionX = collidesRight(); 
    } 

    // react to x collision 
    if (collisionX) { 
     setX(oldX); 
     velocity.x = 0; 
    } 
    // move on y 
    setY(getY() + velocity.y * delta * 5f); 

    if (velocity.y < 0) { // going down 
     collisionY = collidesBottom(); 
    } else if (velocity.y > 0) { // going up 

     collisionY = collidesTop(); 
    } 
    if (collisionY) { 
     setY(oldY); 
     velocity.y = 0; 
    } 
} 
+1

フロートを試してみてください。グラフィックスを初期化していないか、間違ってnullにしている可能性があります。あなたはデフォルトのデスクトップランチャーを使ってゲームを起動していますか?スタックトレースもご覧ください。 – Charanor

答えて

0

ちょうどあなたがこのようなコードデルタ時間リファクタリングを除外する: -

@Override 
public void render() { 
float delta = Gdx.graphics.getDeltaTime(); 
// Log or print this 
if(delta > 0){ 
    player1.update(Gdx.graphics.getDeltaTime()); 

    Gdx.gl.glClearColor(1, 0, 0, 1); 
    ....... 
    ....... 
} 
0

はあなたのような音playerクラスのupdate()メソッドは問題ですが、浮動小数点デルタはありません。速度のように見えます。それはnullです。

private Vector2 velocity; 
... 
//gravity 
velocity.y -= gravity * delta; 

velocity(Vector2)のy public float値を設定しようとしていますが、速度オブジェクトがインスタンス化されていません。

はnullにすることはできません

private Vector2 velocity = new Vector2(); 
関連する問題