2012-10-04 29 views
5

मैं छोटे गुब्बारे खेल बना रहा हूं हटा दें। जहां गुब्बारे यादृच्छिक रूप से पॉप अप करते हैं और थोड़ी देर बाद गायब हो जाते हैं। जब मैंने उन पर क्लिक किया तो मैं उन्हें गायब करना चाहता हूं और गुब्बारे के बजाय +1 दिखा सकता हूं। जब मैं गुब्बारे पर क्लिक करता हूं, तो मैं गुब्बारा स्प्राइट को हटाना चाहता हूं। मेरी समस्या यह है कि जब मैं कोड में sprite.detachSelf() को कॉल करता हूं, तो स्प्राइट बस अपमान करता है लेकिन वास्तव में स्प्राइट को हटाया नहीं जा रहा है। यह केवल अदृश्य हो जाता है। जब मैं उस जगह पर फिर से क्लिक करता हूं तो गुब्बारा गायब हो जाने के बाद भी गुब्बारा दिखाई देता है, यह +1 दिखाता है। जिसका मतलब है कि मुझे लगता है कि गुब्बारे सही ढंग से deattached नहीं है।एंड्रॉयड 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

ध्यान के लिए धन्यवाद। वास्तव में यह काम साथी दोस्त नहीं है। अभी भी एक ही समस्या है। स्प्राइट ठीक से – posha

+0

संलग्न नहीं कर रहा है? मैंने सोचा था कि आप टच इवेंट्स को अलग करने और टालने के बारे में बात कर रहे थे। – gian1200

उत्तर

17

जब आप देते हैं, तो आप अलग करने की जरूरत है; जब आप scene.registerTouchArea(sprite), तो आपको scene.unregisterTouchArea(sprite) की आवश्यकता होती है।

+3

मुझे नहीं पता कि उसने आपको अपनी समस्या का सही जवाब देने के लिए क्यों नहीं दिया, लेकिन आपका समाधान मेरे लिए काम किया, धन्यवाद आदमी! – Jared