3

ゲームを始めました。これが私のコードの一部です。

package games.tribe.screens;

import games.tribe.model.World;
import games.tribe.view.WorldRenderer;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL10;

public class GameScreen implements Screen {

private World world;
private WorldRenderer renderer;

/** This was the bit I'd missed --------------------------------------**/
@Override
public void show() {
    world = new World();
    renderer = new WorldRenderer(world);
}
/**------------------------------------------------------------------**/

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(0.1f, 0.1f, 0.1f, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    renderer.render();
}

@Override
public void resize(int width, int height) {
    // TODO Auto-generated method stub


}

@Override
public void hide() {
    // TODO Auto-generated method stub

}

@Override
public void pause() {
    // TODO Auto-generated method stub

}

@Override
public void resume() {
    // TODO Auto-generated method stub

}

@Override
public void dispose() {
    // TODO Auto-generated method stub

}

}

これがWorldRendererクラスです:

package games.tribe.view;

import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.math.Rectangle;

import games.tribe.model.Block;
import games.tribe.model.TribalHunter;
import games.tribe.model.World;

public class WorldRenderer {

private World world;
private OrthographicCamera cam;

/**for debug rendering**/
ShapeRenderer debugRenderer = new ShapeRenderer();

public WorldRenderer(World world) {
    this.world = world;
    this.cam = new OrthographicCamera(10, 7);
    this.cam.position.set(5, 3.5f, 0);
    this.cam.update();
}

public void render()  {
    //render blocks
    debugRenderer.setProjectionMatrix(cam.combined);
    debugRenderer.begin(ShapeType.Rectangle);
    for(Block block : world.getBlocks()) {
        Rectangle rect = block.getBounds();
        float x1 = block.getPosition().x + rect.x;
        float y1 = block.getPosition().y + rect.y;
        debugRenderer.setColor(new Color(1, 0, 0, 1));
        debugRenderer.rect(x1, y1, rect.width, rect.height);
    }
    //render hunter
    TribalHunter hunter = world.getHunter();
    Rectangle rect = hunter.getBounds();
    float x1 = hunter.getPosition().x + rect.x;
    float y1 = hunter.getPosition().y + rect.y;
    debugRenderer.setColor(new Color(0, 1, 0, 1));
    debugRenderer.rect(x1, y1, rect.width, rect.height);
    debugRenderer.end();

}
}

これは、デスクトップアプリケーションとして実行したときに発生する例外です。

Exception in thread "LWJGL Application" java.lang.NullPointerException
at games.tribe.screens.GameScreen.render(GameScreen.java:19)
at com.badlogic.gdx.Game.render(Game.java:46)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:202)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:131)
AL lib: ReleaseALC: 1 device not closed

gdx.Game.renderの46行目は、次のメソッドです。

@Override
public void render () {
    if (screen != null) screen.render(Gdx.graphics.getDeltaTime());
}

どんな助けでもありがたいです

前もって感謝します

4

1 に答える 1

4

のメソッドで、はGameScreen初期化されていますか?そうでない場合は、問題が発生している可能性があります。render()renderer

編集:エラーの上位2行によると、発生している問題はクラスのNullPointerExceptionオンラインです。オブジェクト自体が初期化されていない可能性が高いために、オブジェクトが何らかのアクションに使用された場合にのみ発生します。19GameScreenNullPointerExceptionnull

の行19GameScreen

renderer.render();

...しかし、オブジェクトrendererはどこにも初期化されていないため、現在はnullこれがデフォルトです。このエラーが発生しないようにするには、rendererそのコード行を実行する前にオブジェクトを初期化する必要があります。おそらくこのようなもので:

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(0.1f, 0.1f, 0.1f, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    renderer = new WorldRenderer();
    renderer.render();
}

私はlibgdxに精通していないので、それが正確にWorldRenderer初期化される方法であるかどうかはわかりませんが、ある種のことを行う必要があります。これがお役に立てば幸いです。

于 2012-06-25T21:03:40.790 に答える