私はAndroidを初めて使用し、AndEngine(www.andengine.org)をベースにした小さなゲームを開発しています。
ゲームは、さまざまなタイプのタイル(一部は移動可能、一部は回転可能)を使用して、背景のタイルマップを表示します。画面にも線を引きます。
問題は、ゲームを初めて実行するとき(電話で実行する場合、Eclipseから開始する場合)は問題なく実行されますが、電話の[戻る]ボタンを使用してゲームを終了し、電話のホーム画面アイコンからゲームを再開すると、アプリケーションに非常にバグがあります。線が画面に表示されなくなり、タイルの移動と回転の機能が1回だけ機能し、ゲームが機能しなくなります。クラッシュすることはありませんが、ゲームの再起動によって引き起こされるバグによって役に立たなくなります。
アプリケーションのライフサイクルで見つけたものをすべて読み、onDestroy()メソッドでさまざまなオブジェクトをnullに設定しようとしましたが、何も違いはありませんでした。最初のアプリの実行から明らかに「ぶらぶら」していて、2回目に起動したときに問題が発生しています。助けてください、24時間のグーグルと私の脳の破壊は無益でした。
ありがとう、スティーブ
PSエミュレータで実行した場合も同じ動作です。
アップデート:
私は自分のコードをさらに調査しました:
上記の問題の一部を調査するための小さなプログラムを作成しました。線を描画しましたが、アプリの再実行時に描画されませんでした。
AndEngineを使用するには、onLoadScene()をオーバーライドする必要があります。このメソッドでは、起動時に画面に表示する内容を指定すると、メソッドはSceneオブジェクトを返します。シーンは画面に表示される内容を処理するため、言いたい場合は、画面に新しい行(またはスプライトなど)を追加して、myScene.addEntity(myLine)を呼び出します。メインアクティビティクラスと、線を引くMyLineというクラスを作成しました。
私の主な活動:
public class LineTest extends BaseGameActivity {
@Override
public Scene onLoadScene() {
scene = new Scene(1);
myLine = new MyLine();
myLine.displayLine();
return scene;
}
}
MyLineクラス:
public class MyLine {
static final Scene SCENE = LineTest.scene;
static final int LINE_WIDTH = 4;
Line line = new Line(0,0,0,0);
public MyLine() {
}
public void displayLine() {
line.setLineWidth(4);
line.setColor(1f, 0f, 0f);
line.setPosition(10, 10, 400, 400);
SCENE.getBottomLayer().addEntity(line);
}
public void removeLine() {
SCENE.getBottomLayer().removeEntity(line);
}
}
上記の問題に気付くかもしれませんが、私の弁護では、私はJavaとOOPを初めて使用します。私のアクティビティは1つのシーンのみを使用するため、MyLineクラス内で、SCENEは変更されないため、静的ファイナルとして宣言できると思いました。間違い!プログラムをデバッグすると、静的な最終SCENEが一度設定されると、プログラムが停止され(戻るキーを使用して)再起動された後でも、変更されないことがわかりました。ただし、プログラムがコードを再起動すると、Scenescene = new Scene(1); 新しいIDで新しいシーンを作成するため、静的な最終シーンは新しいシーンではなく古いシーンを指すため、新しいシーンに線は作成されません。
これを解決するには、次の2つのオプションが機能することがわかりました。
また:
Scene SCENE = LineTest.scene;
または:
static Scene SCENE;
そしてコンストラクターで:
SCENE = LineTest.scene; //I could also pass scene as param to
constructor which may be better OOP practice.
私のゲームアプリケーションに関する他の問題はすべて、あるべきではないときに静的または静的なファイナルとして宣言することに関連していると思います。
型変数(およびメソッド)を決定するときに使用できる経験則はありますか?
更新:Gameクラスの3つの変数が、静的である必要があるときに静的なfinalとして宣言されました。それらを静的に変更し、コンストラクターで割り当てることで、すべての問題が解決しました、WOOHOO!{:-)