Ich bin neu bei Android und ein kleines Spiel auf AndEngine (www.andengine.org) zu entwickeln.Probleme mit Android App zum zweiten Mal
Das Spiel zeigt eine gekachelte Karte für den Hintergrund mit verschiedenen Arten von Kacheln (einige beweglich, einige drehbar). Ich zeichne auch einige Linien auf dem Bildschirm.
Das Problem ist, wenn das Spiel zum ersten Mal läuft (am Telefon, von Eclipse gestartet) läuft es einwandfrei, aber wenn ich das Spiel mit dem Handy ZURÜCK-Taste verlassen und das Spiel vom Handy Startbildschirm-Symbol neu starten, ist die Anwendung sehr Buggy. Die Linien erscheinen nicht mehr auf dem Bildschirm und die Funktionalität von beweglichen und rotierenden Steinen funktioniert nur einmal, wenn das Spiel nicht funktioniert. Es stürzt nicht ab, aber die Fehler, die durch den Neustart des Spiels verursacht werden, machen es nutzlos.
Ich habe alles gelesen, was ich über den Anwendungslebenszyklus finden kann und habe versucht, verschiedene Objekte in der onDestroy() - Methode auf Null zu setzen, aber nichts, was ich getan habe, hat einen Unterschied gemacht. Irgendetwas hängt eindeutig vom ersten App-Lauf ab und verursacht Probleme, wenn es ein zweites Mal gestartet wird. Bitte helfen Sie, 24 Stunden Googeln und Zerbrechen mein Gehirn war fruchtlos.
Danke, Steve
P. S. Gleiches Verhalten bei Ausführung im Emulator.
UPDATE:
ich meinen Code weiter untersucht:
ich ein kleines Programm erstellt Teil des oben genannten Problems zu untersuchen, eine Linie zu zeichnen und es nicht auf dem re-run des App gezogen werden.
Mit AndEngine muss onLoadScene() überschrieben werden. In dieser Methode geben Sie an, was beim Start auf dem Bildschirm angezeigt werden soll, und die Methode gibt ein Szenenobjekt zurück. Eine Szene behandelt das, was Sie auf dem Bildschirm sehen. Wenn Sie also eine neue Zeile (oder ein Sprite oder was auch immer) zum Bildschirm hinzufügen möchten, rufen Sie myScene.addEntity (myLine) auf. Ich habe eine Hauptaktivitätsklasse und eine Klasse namens MyLine erstellt, die die Linie zeichnet.
Meine Haupttätigkeit:
public class LineTest extends BaseGameActivity {
@Override
public Scene onLoadScene() {
scene = new Scene(1);
myLine = new MyLine();
myLine.displayLine();
return scene;
}
}
Die MyLine Klasse:
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);
}
}
Sie können ein Problem mit dem oben bemerkt, in meiner Verteidigung Ich bin neu in Java und OOP. Meine Aktivität verwendet nur eine Szene, also dachte ich, innerhalb meiner MyLine-Klasse könnte ich SCENE als statisches Finale deklarieren, da es sich nicht ändert. FALSCH! Debugging des Programms Ich fand, dass die statische letzte SZENE einmal festgelegt, ändert sich nie, auch nachdem das Programm gestoppt wurde (mit Zurück-Taste) und neu gestartet. Wenn das Programm jedoch die Codeszene neu startet Szene = neue Szene (1); erzeugt eine neue Szene mit einer neuen ID, so dass der statische finale SCENE auf die alte Szene und nicht auf die neue Szene zeigt, daher wird in der neuen Szene keine Linie erzeugt.
Ich fand, dass zwei Möglichkeiten, dies zu lösen arbeiten:
Entweder:
Scene SCENE = LineTest.scene;
Oder:
static Scene SCENE;
Und in Konstruktor:
SCENE = LineTest.scene; //I could also pass scene as param to
constructor which may be better OOP practice.
Ich vermute, meine andere Fragen wit h meine Spielanwendung bezieht sich alle darauf, Dinge als statisch oder statisch endgültig zu deklarieren, wenn sie nicht sein sollten.
Gibt es eine Faustregel, die ich bei der Entscheidung, welche Art von Variablen (und Methoden) sein sollte, verwenden kann?
AKTUALISIERUNG: Ich hatte drei Variablen in meiner Spielklasse, die als statisches Finale deklariert wurden, wenn sie nur statisch sein sollten. Sie in static zu ändern und sie im Konstruktor zuzuordnen, hat alle Probleme gelöst, WOOHOO! {:
OnDestroy wird nicht unbedingt aufgerufen. Und wenn man Dinge auf Null setzt, wird es wahrscheinlich noch schlimmer werden. Sie sollten Ihre Reinigung in onstop tun. Ohne Code zu sehen, haben wir keine Ahnung, wie wir Ihnen helfen können. – Falmarri
Das Spiel enthält ungefähr 12 Klassen, also ist es zu viel zum Posten, denke ich. Gibt es bestimmte Bereiche, auf die ich mich konzentrieren sollte, und vielleicht Codeschnipsel, die ich veröffentlichen sollte? – Steve