2011-07-27 10 views
0

現在、libgdxというフレームワークを使用してゲームプログラミングを学習しています。これにより、ユーザーは、デスクトップのJava仮想マシンとAndroid携帯電話の両方で簡単に実行できるプログラムを作成できます。私は画面に文字を表示し、キーボードで前後に移動させる基本的なプログラムを作ろうとしています。私は、Assetsという3つのクラスを作成しました。ファイルをメモリに読み込んで、テクスチャとアニメーションに変換します。InputHandlerと呼ばれ、アニメーションや動きの方向などを変更してキー入力に応答します。FightView本質的にすべてのレンダリングが行われる場所。 InputHandlerは、input = new InputHandler(anim, frame);のコマンドでFightViewクラスから呼び出されます。 InputHandlerのコンストラクタは次のようになります。Android Game Dev - 新しいオブジェクトを宣言した後のNullPointerException

public InputHandler(Animation animation, TextureRegion region){ 

    Assets.load(); //loads textures from files into memory and creates animations from them 
    animation = Assets.playStance; //set initial animation to be used 
    region = animation.getKeyFrame(0, true); //make TextureRegion equal to first frame in animation 

} 

を今、私が起こるにしたいと、そのよう私がいた場合はアニメーションとTextureRegionは、例えば、上記引用された値に設定されているコンストラクターに渡されるだけであることですinputが宣言された後にFightViewクラスのregionと言えば、animation.getKeyFrame(0, true);と設定されます。ジャワの私の限られた経験から、これは私が起こるはずと信じて何ですが、私は以下のコードの2行目を指して、コンパイル時にNullPointerExceptionが取得:

input = new InputHandler(anim, frame); 
    x = centreX - (frame.getRegionWidth()/2); 

明らかに、frameも渡された後、まだnullです(コンストラクタの3行目に示されているように)コンストラクタを介して値を代入する必要があります。コンストラクタに渡される前に、両方とも実際にnullであることに注意してください。FightViewクラスでフィールドのデータを与える必要がなくクラスを作成しようとしています。

助けてください。これは間違った方法かもしれません。私がしようとしているのは、初期化時にAnimationTextureRegionをデータでロードするオブジェクトを作成することです。

答えて

1

問題は、基本的なJavaの概念の誤解によるものです。 Javaはパラメータを値で渡します。参照ではありません。あなたが書いたことは、あなたが期待したように決して働かないでしょう。

まず、簡単な問題に取り組むか、基本的なJavaの概念とオブジェクトの概念のいくつかを補強するために旅行をすることをお勧めします。

次に、希望するものを達成するための簡単な答えを示します。

AnimationとTextureRegionを保持するためにInputHandlerクラスにメンバーを追加します。コンストラクタ(パラメータを取らない)では、メンバ変数に代入する以外は値を代入します。

class InputHandler { 

    public Animation animation; 
    public TextureRegion region; 

    public InputHandler() { 

     Assets.load(); //loads textures from files into memory and creates animations from them 
     animation = Assets.playStance; //set initial animation to be used 
     region = animation.getKeyFrame(0, true); //make TextureRegion equal to first frame in animation 

    } 
} 

InputHandlerを構築した後で、そのメンバー(この場合はフレーム)を参照して正しい値を確認することができます。

input = new InputHandler(); 
x = centreX - (input.frame.getRegionWidth()/2); 
+0

助けてくれてありがとう、私はあなたが言ったことをやったと、今のコードは次のようになります。 \t \t入力=新しいInputHandler(); \t \t frame = input.frame; \t \t x = centreX - (frame.getRegionWidth()/ 2); また、アニメーションなどを変更するupdate()というInputHandlerのメソッドもあります。ボタンが押されたとき。これらの変更を行うには、そのメソッドを呼び出した後に 'frame = input.frame'行を書く必要がありますか? – semiserious

関連する問題