0

libGDX で scene2D を学習し、nullPointerException に遭遇し続けるために、小さなプロジェクトを開始しました。私の目標は、アクション シーケンスを使用してプレーヤーをジャンプさせることです。私の問題は、プレイヤーがジャンプアップすることですが、一度落ちるとゲームがクラッシュします。問題を引き起こしていると思われるコードの一部を含めました。私はまだ libGDX と scene2d にかなり慣れていないので、setX() setY() メソッドと setPosition(x,y) メソッドの違いが問題を引き起こしている可能性があることに慣れていません。

また、正確に delta と parentAlpha が何であるか、およびそれらを正しく使用する方法についてもう少し知りたいです

私が得るエラー

    Exception in thread "LWJGL Application" java.lang.NullPointerException
at com.badlogic.gdx.scenes.scene2d.actions.MoveToAction.begin(MoveToAction.java:26)
at com.badlogic.gdx.scenes.scene2d.actions.TemporalAction.act(TemporalAction.java:48)
at com.badlogic.gdx.scenes.scene2d.actions.SequenceAction.act(SequenceAction.java:65)
at com.badlogic.gdx.scenes.scene2d.Actor.act(Actor.java:85)
at com.chiefpeanut.noodle.Tony.act(Tony.java:48)
at com.badlogic.gdx.scenes.scene2d.Group.act(Group.java:48)
at com.badlogic.gdx.scenes.scene2d.Stage.act(Stage.java:225)
at com.chiefpeanut.noodle.GameScreen.render(GameScreen.java:54)
at com.badlogic.gdx.Game.render(Game.java:46)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:207)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)

私のプレーヤークラスの重要な部分

public class Tony extends Actor{

public Rectangle bounds;
public float posX;
public float posY;
MoveToAction jumpUp;
MoveToAction jumpDown;
public Tony() {     
    posX = 10f;
    posY = 10f;
        
    bounds = new Rectangle();
    setHeight(100);
    setWidth(100);
    //scale(1, 1);
    setPosition(10, 10);
    
    
    setX(10f);
    setY(10f);
    setPosition(10, 10);
    jumpUp = new MoveToAction();
    jumpUp.setPosition(10, 80);
    jumpUp.setDuration(2f);
    
    jumpDown = new MoveToAction();
    jumpDown.setPosition(10, 10);
    jumpDown.setDuration(2f);
    
}


public void act(float delta){
    super.act(delta);<<--------SHOWS ERROR OCCURRING HERE------
    updateBounds();
    }
public void jump() {
    addAction(Actions.sequence(jumpUp, jumpDown));

}

public void draw(SpriteBatch batch, float parentAlpha){
    batch.draw(Assets.textureTony, getX(), getY(), getWidth(), getHeight());
    
}


}

私の GameScreen クラスの重要な部分については、

public class GameScreen implements Screen, GestureListener {

MyGame game;
OrthographicCamera camera;
static SpriteBatch batch;
Stage stage;
Tony player;
Array<Block> blocks;

public GameScreen(MyGame game) {
    this.game = game;
    camera = new OrthographicCamera();
    camera.setToOrtho(false, 1920, 1080);
    camera.update();
    
    player = new Tony();
    
    batch = new SpriteBatch();
    stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    
    stage.addActor(player);     
    
}

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(1F, 1F, 1F, 1F);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    batch.setProjectionMatrix(camera.combined);
    
    stage.act(delta);//<<----SHOWS ANOTHER ERROR OCCURRING HERE-------
    stage.draw();
    System.out.println("rendered");
    

    if(Gdx.input.isKeyPressed(Keys.W)){
        player.jump();
    }
    if(Gdx.input.isKeyPressed(Keys.D)){
        //player.testMove();
        System.out.println(player.getX());
    }
    
    
}

@Override
public void resize(int width, int height) {

}

@Override
public void show() {
    Gdx.input.setInputProcessor(new GestureDetector(this));

}

@Override
public void hide() {
    Gdx.input.setInputProcessor(null);

}

}

私は自分のレンダリングを間違って使用していると思い始めました.5つの異なるチュートリアルから離れているので、これはおそらく正しいです.しかし、スタックトレースのMoveToAction.java:26エラーをクリックすると、Thisの26行目が表示されます.「startX = actor.getX();」という行にエラーがあるドキュメント (github 上) 私は非常に混乱しており、何日もさまざまなことを試していて、何が間違っているのかを突き止めようとしています.

ご助力ありがとうございます

4

2 に答える 2

0

正確なエラーはわかりません。このためには、ブレークポイントでデバッグを使用する必要があります。エラー自体はMoveToAction.begin()、26 行目のメソッド内で発生します。この行を調べて、この時点でどの変数が null であるかを確認する必要があります。それがわかるとすぐに、コードのデバッグが容易になります。
コードを見ると、あなたActorはnullのようです。どこかで彼をnullに設定していますか?
とにかく、Actionsクラスを使用することをお勧めします。プールされたアクションを返し、使いやすいです。jump()メソッドでは、次のように使用できます。

public void jump() {
    this.addAction(Actions.sequenze(Actions.moveTo(10, 80, 2f), Actions.moveTo(10, 10, 2f)));
}

メソッドが呼び出された場合、jump()たとえばキーを押している場合、ブール値を保持する必要があります。これは、すでにジャンプしているかどうかを示します。

2 番目の質問に:

  1. float deltaメソッドの最後の呼び出しからの経過時間 (render()秒単位)。FPS (1 秒あたりのフレーム数) は、次の式を使用して計算されalphaますFPS = 1/delta。のact(delta)メソッドActorはこれを使用deltaして、時間に応じて位置、回転を更新します。たとえば、 aはActor1 秒あたり 10 単位移動する必要があります。act(delta)setX(getX()+10*delta)
  2. は、 の値 (不透明度) をfloat parentAlpha記述します。すべてのにはルート グループがあり、そこにが追加されます。もちろん、独自のものを に追加することもできます。半分透明にしたい場合は、を 0.5f に設定します。その中のすべてのは、 draw メソッドの としてこれを取得します。あなた(あなたの場合はクラス)にこのアルファを無視させることができますが、彼にこのアルファの影響を与えることもできます:alphagroupActorstageActorstage.addActor(myActor)GroupstagegroupalphaActorgroupparentAlphaActorClassTony

    public void draw (SpriteBatch batch, float parentAlpha) { Color color = getColor(); // アクターの色合いの色 batch.setColor(color.r, color.g, color.b, color.a*parentAlpha); // 描く }

読むべきもの: Scene2D wiki 記事

于 2014-03-31T06:32:06.983 に答える