2010-11-27 13 views
2

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! {:

+1

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

+0

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

Antwort

0

Warum haben Sie in Ihrer Klasse sogar ein statisches Feld, wenn es für die Instanz spezifisch ist? Machen Sie es zu einer Instanzvariable oder so.

Sie könnten auch alle statischen Felder manuell zurücksetzen, wenn die Anwendung geöffnet wird, aber das wäre sehr hässlich.

+0

Entschuldigung, ich hatte eine alte, nicht abgesendete Frage überschrieben und vergessen, den Titel zu ändern. Was mein Klassendesign angeht, habe ich eine abstrakte Klasse GameTile, die einige statische Felder und Methoden enthält, die für alle Kacheln auf dem Bildschirm gelten. Ich habe dann eine Reihe von verschiedenen Klassen, die GameTile erweitern, wie LaserEmitter und LaserSplitter, die ein spezifischeres Verhalten für einzelne Kacheltypen beschreiben, die Instanzvariablen enthalten. Ich bin auch neu in Java, also haben einige Dinge falsch gemacht, aber es funktioniert gut bei der ersten Ausführung. – Steve

+0

Sie waren auf dem richtigen Weg für statische Felder. Ich habe oben mit meinen Ergebnissen geantwortet, danke für den Zeiger. – Steve

0

Irgendetwas hängt eindeutig vom ersten App-Lauf ab und verursacht Probleme, wenn es ein zweites Mal gestartet wird.

Haben Sie Ihre eigene Anwendungsunterklasse erstellt? Wenn Sie eine Initialisierung des Spiels auf der Anwendungsebene und dann eine andere Initialisierung auf der Aktivitätsebene durchführen, wird die vorherige nicht wiederholt, bis die App selbst beendet und neu gestartet wird. Das einfache Beenden mit der BACK-Taste beendet die App nicht direkt.

+0

Danke. Nicht sicher, was genau Sie mit der Anwendungsunterklasse meinen. Die Hauptaktivität erweitert BaseGameActivity (Teil der AndEngine) und ich mache alles hier oder in den hier genannten Klassen.Ich habe den Debugger beim Neustart der App ausgeführt und alles, was ich geschrieben habe, wird erneut ausgeführt, aber das Ergebnis auf dem Bildschirm unterscheidet sich deutlich vom ersten App-Lauf. – Steve

+0

OK, wenn Sie nicht wissen, dann haben Sie wahrscheinlich nicht und meine Antwort gilt nicht. Im Grunde erweitert die öffentliche Klasse MyClass die Anwendung {} und Sie verwenden sie dann im Element AndroidManifest.xml . Alles, was im Application-Objekt deklariert/instanziiert wird, bleibt so lange bestehen, bis die Anwendung selbst zum Beispiel mit 'force stop' im Application Manager beendet wird oder wenn das Android-System den Speicher benötigt. – Squonk

+0

Ich sehe, danke für die Erklärung. Nein, überhaupt nichts in meinem Code. Auch AndEngine benötigt keine Einträge in das Manifest, also kann ich es nicht ohne mein Wissen selbst tun;) – Steve

0

Vorsicht bei der Verwendung von statischen Endvariablen !!! Lösung für meine Probleme oben.

-2

Ich habe dieses Problem auch gelöst, und ich lösen es durch Entfernen einiger statischer Variablen und statische Methode. Ich weiß, die statische Variable wird im Speicher bleiben, wenn Sie auf die Schaltfläche Zurück in Android klicken, aber ich weiß immer noch nicht, warum der Effekt so seltsam ist. Auch danke alle oben!

Verwandte Themen