2012-10-04 65 views
5

我正在创建小型气球游戏。气球随机弹出并稍后消失。当我点击它们时,我想消失它们并显示+1而不是气球。当我点击气球时,我想解开气球精灵。 我的问题是当我在代码中调用sprite.detachSelf()时,精灵会消失,但实际上精灵尚未被删除。它只是变得不可见。当我再次点击气球出现的地方时,即使气球消失后,它也会显示+1。这意味着我认为气球没有正确拆卸。Android AndEngine:sprite.detachSelf()不删除精灵

这里是我的代码:

@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);; 
} 
+0

我的回答对你有帮助吗? – gian1200

+0

感谢您的关注。其实它ddnt工作伙伴。仍然我有同样的问题。精灵未正确安装 – posha

+0

正在附加?我以为你在谈论分离和避免触摸事件。 – gian1200

回答

17

当你连接,你需要分离;当你scene.registerTouchArea(sprite),你需要scene.unregisterTouchArea(sprite)

+3

我不知道他为什么不奖励你为他的问题得到正确的答案,但你的解决方案为我工作,谢谢你! – Jared