Frage

Ich bin neu in Android und ein kleines Spiel auf AndEngine basierte Entwicklung (www.andengine.org).

Das Spiel zeigt eine geflieste Karte für den Hintergrund, mit verschiedenen Arten von Fliesen (einige beweglich, einige drehbar). Ich zeichne auch einige Linien auf dem Bildschirm.

Das Problem ist, wenn das Spiel läuft erstes Mal (laufen am Telefon, gestartet von Eclipse) läuft es einwandfrei, aber wenn ich das Spiel beenden das BACK-Taste des Telefons mit und das Spiel aus dem Telefon Startbildschirm neu starten Symbol der Anwendung ist sehr buggy . Die Linien erscheinen nicht mehr auf dem Bildschirm und die Funktionalität von sich bewegenden und rotierenden Platten funktioniert nur einmal, dann ist das Spiel nicht-betriebsbereit. Es stürzt nicht ab, aber die durch das Spiel verursachten Fehler neu starten, es nutzlos machen.

Ich habe alles gelesen ich auf dem Anwendungs-Lebenszyklus finden und versucht, verschiedene Objekte zu Null in der onDestroy () -Methode Einstellung, aber nichts, was ich tun einen Unterschied gemacht hat. Etwas ist klar ‚hanging around‘ von der ersten App läuft und verursachen Probleme, wenn es ein zweites Mal gestartet wird. Bitte Hilfe, 24 Stunden googeln und wracking mein Gehirn hat fruchtlos gewesen.

Danke, Steve

P. S. Gleiches Verhalten, wenn in Emulator ausgeführt werden.

UPDATE:

suchte ich meinen Code weiter:

Ich habe ein kleines Programm auf einen Teil des oben genannten Problems zu untersuchen, eine Linie zu zeichnen und es nicht auf dem re-run des App gezogen werden.

Mit einem AndEngine muss onLoadScene außer Kraft setzen (). Bei dieser Methode geben Sie, was Sie auf dem Bildschirm beim Start wollen und die Methode gibt ein Szenenobjekt. Eine Szene Griffe, was Sie auf dem Bildschirm zu sehen, so dass, wenn Sie sagen wollen, eine neue Zeile hinzufügen (oder Sprite, oder was auch immer) auf dem Bildschirm, rufen Sie myScene.addEntity (Myline). Ich habe eine Hauptaktivitätsklasse und eine Klasse namens MyLine die die Linie zieht.

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 der oben bemerkt, in meiner Verteidigung: Ich bin zu Java und OOP. Meine Tätigkeit verwendet nur eine Szene, so dass ich dachte, in meinem MyLine Klasse, konnte ich SZENE als static final erklären, wie es wird sich nicht ändern. FALSCH! Testen des Programms ich, dass die statische letzte Szene einmal Satz gefunden, ändert sich nie, auch nachdem das Programm beendet wurde (zurück Taste) und neu gestartet. Wenn jedoch das Programm startet die Code Szene Szene = new Szene (1); eine neue Szene schafft mit einem neuen ID, so dass die statische letzte Szene zeigt auf die alte Szene nicht die neuen, daher keine Linie in der neuen Szene erstellt wird.

Ich fand, dass zwei Möglichkeiten, dies zu lösen arbeiten:

Entweder:

Scene SCENE = LineTest.scene;

Oder:

static Scene SCENE;

Und im Konstruktor:

    SCENE = LineTest.scene; //I could also pass scene as param to 
constructor which may be better OOP practice.

Ich vermute, meine anderen Probleme mit meinem Spiel-Anwendung auf alle Dinge im Zusammenhang als statisch deklarieren oder static final, wenn sie nicht sein sollte.

Gibt es eine Faustregel gilt: ich verwenden kann, bei der Entscheidung, welche Art Variablen (und Methoden) enthalten sein sollten?

UPDATE: Ich hatte drei Variablen in meinem Spiel-Klasse als static final deklariert, wenn sie nur statisch sein sollte. Ändern sie zu statisch und sie im Konstruktor zuweisen hat alle Probleme gelöst, Woohoo! {: -)

War es hilfreich?

Lösung

Warum haben Sie sogar ein statisches Feld in der Klasse, wenn es spezifisch auf die Instanz? Machen Sie ihm eine Instanzvariable oder so.

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

Andere Tipps

  

Etwas ist klar ‚hanging around‘ von der ersten App laufen und verursacht Probleme, wenn es ein zweites Mal gestartet wird.

Haben Sie erstellt Ihre eigene Anwendung Unterklasse? Wenn Sie einige der Initialisierung des Spiels auf der Anwendungsebene tun, und dann andere Initialisierung auf das Aktivitätsniveau, dann der ehemalige gewohnt wiederholt werden, bis die App selbst getötet und neu gestartet wird. Einfach Verlassen der BACK-Taste mit der App nicht direkt töten.

Seien Sie bei der Verwendung von statischen endgültigen Variablen vorsichtig !!! Lösung für meine Probleme oben.

traf ich auch dieses Problem, und ich es beheben, indem Sie einige statischen Variablen und statische Methode entfernen. Ich weiß, dass die statische Variable in Erinnerung bleiben wird, wenn der Knopf in Android klicken zurück, aber ich weiß noch nicht, warum die Wirkung so seltsam. Auch dank jedem oben!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top