Das gleiche passierte mir während der Spieleentwicklung mit dem LibGDX-Framework für Android. Und hier ist der Grund:
Ich habe 2 Bildschirme - GameScreen
und BattleScreen
. GameScreen
Hier bewege ich meinen Charakter auf der Karte. Wenn ich mit einem feindlichen Sprite kollidiere, benutze ich sofort den game.setScreen(new BattleScreen(this))
aktuellen Bildschirm und ändere ihn auf BattleScreen
. Hier passierte früher das Fatal Signal 11. Zuerst dachte ich, es hätte etwas mit dem Laden von Assets zu tun, da meine Asset Manager-Instanz statisch war. Ich habe mehrere Möglichkeiten zum Laden ausprobiert, aber nichts hat funktioniert. Es stellte sich heraus, dass ich den Bildschirm an der falschen Stelle wechselte. Für meine hatte GameScreen
ich WorldController
und WorldRenderer
Instanz. Ich benutzte worldController.update()
und worldRenderer.render()
in GameScreen
's render(float deltaTime)
Methode. InnerhalbworldController.update()
Ich suchte nach Kollisionen und wechselte den Bildschirm, sobald ich eine mit dem Feind fand. Es war nicht gut für Android, vielleicht weil es zwischen Update und Rendering passiert ist oder es einige Zeit gedauert hat, während das Update noch lief und es zu Konflikten führte - ich weiß nicht. Aber so habe ich es behoben:
- Ich habe ein boolesches Flag (standardmäßig false) hinzugefügt
WorldController
und jedes Mal, wenn eine Kollision mit dem Feind passiert ist, habe ich es auf true gesetzt
- In
GameScreen
's habe render()
ich dieses Flag überprüft - wenn es wahr wäre, würde ich den Bildschirm auf ändern BattleScreen
, sonst würde ich aktualisieren und rendernGameScreen
Jetzt funktioniert es jedes Mal perfekt, kein FATAL SIGNAL ERROR 11
Hier ist mein GameScreen
‚s - render()
Methode:
@Override
public void render(float deltaTime) {
if(worldController.isCollisionWithEnemy()) {
game.setScreen(game.battleScreen);
} else {
if(!paused) {
worldController.update(deltaTime);
}
Gdx.gl.glClearColor(57.0f / 255.0f, 181.0f / 225.0f, 115.0f / 255.0f, 1.0f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
worldRenderer.render();
}
}