2013-06-22 3 views
0

: D У меня есть проблема с отсоединиться и attachChild ..pEntity 'nameentity' уже имеет родителя: «Сцена». Новый родитель: 'Сцена'

scene.registerUpdateHandler(new IUpdateHandler() { 
     @Override 
     public void reset() { } 

     @Override 
     public void onUpdate(final float pSecondsElapsed) { 
// USELESS CODE 
// USELESS CODE 
// USELESS CODE  
      if (!SUPER){ 
       if (player.collidesWith(Blinky) || 
        player.collidesWith(Pinky) || 
        player.collidesWith(Inky) || 
        player.collidesWith(Clyde)){ 
         player.animate(new long[]{130,130,130,130,130,130}, 24, 29, false); 
         player.stopPlayer(); 
       } 
      } 
      else { 
       if (player.collidesWith(Blinky)){ 
        scene.detachChild(Blinky); 
        respawnGhost("Blinky"); 
       } 
       else if (player.collidesWith(Pinky)){ 
        scene.detachChild(Pinky); 
        respawnGhost("Pinky"); 
       } 
       else if (player.collidesWith(Inky)){ 
        scene.detachChild(Inky); 
        respawnGhost("Inky"); 
       } 
       else if (player.collidesWith(Clyde)){ 
        scene.detachChild(Clyde); 
        respawnGhost("Clyde"); 
       } 
      } 
     } 
    }); 

С помощью этого кода я отделяться ..

И с этим:

private void respawnGhost(final String ghost){ 
    final Path RespawnPath = new Path(9).to(265, 295).to(225,295).to(225,255).to(305, 255).to(305, 295).to(225, 295).to(225,255).to(265,255).to(265,215); 
    TimerHandler spriteTimerHandler; 
    ITimerCallback Callback; 

    this.getEngine().registerUpdateHandler(spriteTimerHandler = new TimerHandler(5,true,Callback = new ITimerCallback(){ 

     @Override 
     public void onTimePassed(TimerHandler pTimerHandler) { 


     if(ghost.compareTo("Blinky") == 0){ 
      scene.attachChild(Blinky); 
      Blinky.registerEntityModifier(new PathModifier(10, RespawnPath, null, new IPathModifierListener() { 
       @Override 
       public void onPathStarted(final PathModifier pPathModifier, final IEntity pEntity) { 

       } 

       @Override 
       public void onPathWaypointStarted(final PathModifier pPathModifier, final IEntity pEntity, final int pWaypointIndex) { 

       } 

       @Override 
       public void onPathWaypointFinished(final PathModifier pPathModifier, final IEntity pEntity, final int pWaypointIndex) { 

       } 

       @Override 
       public void onPathFinished(final PathModifier pPathModifier, final IEntity pEntity) { 

        Blinky.direction=4; 
        Blinky.ghostVel = (int)VELOCITY + 10; 
        Blinky.setVelocity((int)VELOCITY + 10,0); 
        Blinky.randDir = (int)(randRespawn.nextFloat() * 10)%3; 
       } 
      })); 
     } 

i RE-attach ...

Но когда вызывается OnTimePassed(), TADAAAA! Появилось следующее исключение: V

java.lang.IllegalStateException: pEntity 'Ghost' уже имеет родителя: 'Scene'. Новый родитель: «Сцена»! в org.andengine.entity.Entity.assertEntityHasNoParent (Entity.java:1412) в блаблабла ....

Но если я комментарий:

//this.getEngine().registerUpdateHandler(spriteTimerHandler = new TimerHandler(5,true,Callback = new ITimerCallback(){ 

    //// @Override 
    //// public void onTimePassed(TimerHandler pTimerHandler) { 

все отлично работает ...

Кто-нибудь может мне помочь? :)

пс: простите за мой плохой английский действительно к.ц

+0

У каждого объекта есть только один родитель и несколько детей. Когда объект C присоединен к объекту P, родительский элемент C устанавливается в P, а C добавляет к дочернему списку P по AndEngine внутренне. Из вашего кода выше у вас есть одна сущность под названием «Blinky», но вы добавляете ее в сцену несколько раз. Может быть, либо смените свой таймер на таймер, либо вам понадобится пул Blinky, и прикрепите Free Blinky к ощущению вашего повторного таймера. –

ответ

0

Я частично понимаю вашу проблему и попытаться дать ответ как можно лучше. Прежде всего, если вы хотите отделить часть объекта от сцены, вам нужно использовать обработчик обновлений, как описано ниже.

mActivity.runOnUpdateThread(new Runnable(){ 

     public void run(){ 
      mScene.detachChild(mEntity); 
     } 
}); 

Это предпочтительный способ удаления объекта из сцены, если у вас есть какие-либо исключения.

И вы нашли IllegalStateException, потому что вы уже привязали эту сущность к сцене. Поэтому, если вы попытаетесь снова присоединить одно и то же лицо, это приведет к возникновению исключения.

spriteTimerHandler = new TimerHandler(5,true,new ITimerCallback(){}); 

Я сказал выше, потому что вы применили true в обработчике таймера, чтобы он вызывал многократное время. Таким же субъектом пытаются снова и снова присоединяться.