Android AndEngine: sprite.detachSelf () no elimina el sprite
Estoy creando un juego de globo pequeño. Donde los globos aparecen aleatoriamente y desaparecen después de un rato. Cuando hice clic en ellos los quiero desaparecer y mostrar +1 en lugar del globo. Cuando hago clic en el globo, quiero desatar el sprite del globo. Mi problema es cuando llamo sprite.detachSelf () en el código, el sprite sólo disapears pero en realidad el sprite no se ha eliminado. Sólo se vuelve invisible. Cuando hago clic de nuevo en ese lugar aparece el globo, incluso después de que el globo ha desaparecido muestra +1. Lo que significa que creo que el globo no ha deattached correctamente.
Aquí está mi código:
- AndEngine - Kill Sprite después de X segundos?
- Y el motor aplican fuerza
- Android Studio y AndEngine - el paquete no existe
- Cambiar de AndEngine a libgdx - qué saber?
- AndEngine Juego Loop. ¿Dónde está?
@Override protected Scene onCreateScene() { //this.mEngine.registerUpdateHandler(new FPSLogger()); scene = new Scene(); backgroundSprite = new Sprite(0, 0, this.mBackgroundTextureRegion, getVertexBufferObjectManager()); backgroundSprite.setSize(CAMERA_WIDTH, CAMERA_HEIGHT); scene.attachChild(backgroundSprite); scene.unregisterTouchArea(backgroundSprite); text = new Text(0, 0, font, "Score : 00", getVertexBufferObjectManager()); scene.attachChild(text); textTime = new Text(displayMetrics.widthPixels - 220, 0, font, "00 : 60", getVertexBufferObjectManager()); scene.attachChild(textTime); timer = new TimerClock(1, new TimerClock.ITimerCallback() { TimerClock t = timer; public void onTick() { System.out.println("timer inside"); if (time > 0) { time = time - 1; System.out.println("timer inside : " + time); scene.detachChild(textTime); textTime = new Text(displayMetrics.widthPixels - 220, 0, font, "00 : " + time, getVertexBufferObjectManager()); if (time < 10) { textTime.setColor(1, 0, 0); } scene.attachChild(textTime); deleteSpriteSpawnTimeHandler(sprite); } else{ scene.unregisterUpdateHandler(this.t); } } }); this.mEngine.registerUpdateHandler(timer); createSpriteSpawnTimeHandler(); return scene; } private void deleteSpriteSpawnTimeHandler(final IEntity ball) { TimerHandler spriteTimerHandler1; final Engine e = mEngine; this.getEngine().registerUpdateHandler( spriteTimerHandler1 = new TimerHandler(0.5f, true, new ITimerCallback() { @Override public void onTimePassed( final TimerHandler spriteTimerHandler1) { spriteTimerHandler1.reset(); deleteSprite(ball); } })); } private void gameOverSpawnTimeHandler() { TimerHandler spriteTimerHandler1; final Engine e = mEngine; this.getEngine().registerUpdateHandler( spriteTimerHandler1 = new TimerHandler(60, true, new ITimerCallback() { @Override public void onTimePassed( final TimerHandler spriteTimerHandler1) { spriteTimerHandler1.reset(); timeDue = 0; scene.detachChild(textComment); textComment = new Text(CAMERA_WIDTH / 2 - 100, CAMERA_HEIGHT / 2, font, "Game Over...!!!", getVertexBufferObjectManager()); textComment.setColor(1.0f, 0.0f, 0.0f); scene.attachChild(textComment); SharedPreferences myPrefs = getApplicationContext().getSharedPreferences("myPrefs", MODE_WORLD_READABLE); SharedPreferences.Editor prefsEditor = myPrefs.edit(); String score1 = myPrefs.getString("SCORE1", "0"); String score2 = myPrefs.getString("SCORE2", "0"); int scoreInt1 = Integer.parseInt(score1); int scoreInt2 = Integer.parseInt(score2); System.out.println("session in" + score1 + " " + score2); currScore = totalScore; if (currScore > scoreInt1 && currScore > scoreInt2) { prefsEditor.clear(); prefsEditor.commit(); prefsEditor.putString("SCORE1", String.valueOf(currScore)); prefsEditor.putString("SCORE2", String.valueOf(scoreInt1)); prefsEditor.commit(); } else if (currScore < scoreInt1 && currScore > scoreInt2) { prefsEditor.clear(); prefsEditor.commit(); prefsEditor.putString("SCORE1", String.valueOf(scoreInt1)); prefsEditor.putString("SCORE2", String.valueOf(currScore)); prefsEditor.commit(); } else { } } })); } private void createSpriteSpawnTimeHandler() { TimerHandler spriteTimerHandler; final Engine e = mEngine; this.getEngine().registerUpdateHandler( spriteTimerHandler = new TimerHandler(0.75f, true, new ITimerCallback() { @Override public void onTimePassed( final TimerHandler spriteTimerHandler) { spriteTimerHandler.reset(); // scene.detachChild(backgroundSprite); // scene.attachChild(backgroundSprite); // Random Position Generator final float xPos = MathUtils.random(50.0f, (CAMERA_WIDTH - 50.0f)); final float yPos = MathUtils.random(75.0f, (CAMERA_HEIGHT - 75.0f)); gameOverSpawnTimeHandler(); if (timeDue > 0) { createSprite(xPos, yPos); }else{ //scene.unregisterUpdateHandler(spriteTimerHandler); } } })); } private void createSpriteTextSpawnTimeHandler() { TimerHandler spriteTimerHandler; final Engine e = mEngine; this.getEngine().registerUpdateHandler( spriteTimerHandler = new TimerHandler(mEffectSpawnDelay, true, new ITimerCallback() { @Override public void onTimePassed( final TimerHandler spriteTimerHandler) { spriteTimerHandler.reset(); if (totalScore > 50 && totalScore < 60) { textComment = new Text(150, 100, font, "Ohhhh...you are doing good.", getVertexBufferObjectManager()); textComment.setColor(1.0f, 0.0f, 0.0f); scene.attachChild(textComment); } deleteSpriteSpawnTimeHandler(textComment); // e.getScene().detachChild(backgroundSprite); // e.getScene().attachChild(backgroundSprite); } })); } private void createSprite(final float pX, final float pY) { sprite = new Sprite(pX, pY, this.mrball, getVertexBufferObjectManager()) { Engine e = mEngine; TextureRegion gball = mgball; float x = pX; float y = pY; private int score = totalScore; private Text textComment;; @Override public boolean onAreaTouched( org.andengine.input.touch.TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) { if (pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN) { this.e.getScene().detachChild(this); if (timeDue > 0) { mBrushDrawingSound.play(); totalScore = totalScore + 1; String score = "Score : " + totalScore; scene.detachChild(text); text = new Text(0, 0, font, score, getVertexBufferObjectManager()); scene.attachChild(text); //sprite.detachSelf(); createSpriteTextSpawnTimeHandler(); textScorePlus = new Text(x, y, font, "+1", getVertexBufferObjectManager()); scene.attachChild(textScorePlus); scene.unregisterTouchArea(textScorePlus); deleteSpriteSpawnTimeHandler(textScorePlus); } } else if (pSceneTouchEvent.getAction() == TouchEvent.ACTION_UP) { } // e.getScene().unregisterTouchArea(sprite); return true; } }; spriteBalloon.add(sprite); sprite.setSize(100, 100); sprite.setAlpha(0.8f); Random randomGenerator = new Random(); red = randomGenerator.nextInt(255); green = randomGenerator.nextInt(255); blue = randomGenerator.nextInt(255); sprite.setColor(red, green, blue); scene.registerTouchArea(sprite); scene.attachChild(sprite); deleteSpriteSpawnTimeHandler(sprite); } private void deleteSprite(IEntity pBall) { IEntity gball = pBall; scene.detachChild(gball);; }
- ¿Qué está mal con mi código PhysicsRemoveExample.java (AndEngine)?
- No se puede exportar la aplicación de Android en Eclipse
- ¿Cómo utilizar la fuente y el texto en andEngine?
- Las 5 mejores puntuaciones de google leaderboard
- Sprite Rotación alrededor de un punto Andengine / Java
- ¿Cómo animar una explosión que sopla los cuerpos circundantes lejos?
- AndEngine cámara offset y 2 escenas
- Muestras en AndEngine
Cuando se adjunta, es necesario separar; Cuando scene.registerTouchArea(sprite)
, necesitas scene.unregisterTouchArea(sprite)
.