Domanda

Sono nuovo di Android e lo sviluppo di un piccolo gioco basato su AndEngine (www.andengine.org).

Il gioco mostra una mappa piastrelle per lo sfondo, con diversi tipi di piastrelle (alcuni mobili, qualche girevoli). Ho anche disegnare alcune linee sullo schermo.

Il problema è che quando il gioco viene eseguito prima volta (in esecuzione sul telefono, ha iniziato da Eclipse) funziona senza problemi, ma se esco dal gioco usando il pulsante Indietro del telefono e si riavvia il gioco dal homescreen icona del telefono l'applicazione è molto buggy . Le linee non sono più visualizzate sullo schermo e la funzionalità di spostamento e la rotazione piastrelle funziona solo una volta, allora il gioco è non operativa. Esso non va in crash, ma i bug causati dal gioco RESTART rendono inutile.

Ho letto tutto quello che posso trovare sul ciclo di vita dell'applicazione e provato a installare vari oggetti per nulla nel metodo OnDestroy (), ma niente che faccio ha fatto alcuna differenza. Qualcosa è chiaramente 'giro' dalla prima esecuzione applicazione e causando problemi quando viene avviato una seconda volta. Si prega di aiuto, 24 ore di usare Google e wracking mio cervello è stato inutile.

Grazie, Steve

P.S. Lo stesso comportamento quando eseguito in emulatore.

UPDATE:

Ho indagato ulteriormente il mio codice:

Ho creato un piccolo programma per indagare una parte del problema di cui sopra, tracciando una linea e non in corso di elaborazione sulla ripetizione della app.

Utilizzando AndEngine uno deve avere la priorità onLoadScene (). In questo metodo si specifica ciò che si desidera sullo schermo all'avvio e il metodo restituisce un oggetto scena. A maniglie scena quello che si vede sullo schermo, quindi se si vuole dire, aggiungere una nuova riga (o sprite, o qualsiasi altra cosa) per lo schermo, si chiama myScene.addEntity (myLine). Ho creato una classe di attività principale e una chiamata MyLine classe che disegna la linea.

La mia attività principale:

public class LineTest extends BaseGameActivity {

@Override
    public Scene onLoadScene() {
        scene = new Scene(1);
        myLine = new MyLine();
        myLine.displayLine();   
        return scene;
    }
}

La classe 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);
    }
}

Si può notare un problema con quanto sopra, in mia difesa Sono nuovo di Java e OOP. Le mie attività utilizza una sola scena, così ho pensato, nel mio classe MyLine, ho potuto dichiarare scena come una finale statico non cambierà. SBAGLIATO! Test del programma ho scoperto che la scena finale statica, una volta impostato, non cambia mai, anche dopo che il programma è stato interrotto (con il tasto indietro) e riavviato. Tuttavia, quando il programma riavvia il codice di scena Scene = new Scene (1); crea una nuova scena con un nuovo ID, in modo che i punti di scena finale statico alla vecchia scena non quello nuovo, quindi nessuna linea viene creato nella nuova scena.

ho scoperto che due opzioni funzionano per risolvere questo:

In entrambi:

Scene SCENE = LineTest.scene;

o

static Scene SCENE;

E nel costruttore:

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

Ho il sospetto che altri miei problemi con la mia applicazione di gioco sono tutti legati a dichiarare cose come statica o statica finale quando non dovrebbero esserlo.

C'è una regola empirica che posso usare quando decidere quali variabili di tipo (e metodi) dovrebbero essere?

UPDATE: Ho avuto tre variabili nella mia classe di gioco dichiarata come statica finale, quando avrebbero dovuto essere solo statica. cambiarle a statico e assegnandole nel costruttore ha risolto tutti i problemi, Woohoo! {: -)

È stato utile?

Soluzione

Perché ancora di avere un campo statico nella classe quando è specifico per l'istanza? Ne fanno una variabile di istanza o giù di lì.

Si potrebbe anche azzerare tutti i campi statici manualmente quando l'applicazione viene aperta, ma che sarebbe stato molto brutto.

Altri suggerimenti

  

Qualcosa è chiaramente 'giro' dalla prima esecuzione applicazione e causando problemi quando viene avviato una seconda volta.

Avete creato la vostra sottoclasse di applicazione? Se si sta facendo un po 'di inizializzazione del gioco a livello di applicazione e quindi altri l'inizializzazione a livello di attività, poi l'ex solito essere ripetuta fino a quando l'applicazione stessa viene ucciso e riavviato. Basta uscire usando il tasto BACK non uccide direttamente l'applicazione.

Fare attenzione con l'uso di variabili statiche finali !!! Soluzione ai miei problemi di cui sopra.

Ho incontrato anche questo problema, e mi risolverlo da rimuovere alcune variabili statiche e metodo statico. So che la variabile statica rimarrà nella memoria quando fai clic sul pulsante di nuovo in Android, ma io ancora non so il motivo per cui l'effetto così strano. Grazie anche a tutti sopra!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top