2013-07-22 5 views
3

Я создаю игру, используя Andengine, и в этом хочу, чтобы объект летал в небе, чтобы сбросить бомбы внизу. В настоящее время я использую обработчик времени для создания как летающего объекта, так и бомб. Но он не работает должным образом. Проблемы, с которыми я столкнулся:
1) Иногда вместо одной бомбы отбрасываются 2 или 3 бомбы.
2) И объекты бомбы также не перерабатываются. Код для рециркуляции объекта вызван, но он, похоже, не работает.

Я заметил одно: предположим, изначально у меня есть один летающий объект, который бросает бомбу. Когда бомба покидает экран, код рециркуляции для объекта бомбы вызывается один раз. И когда-то, когда летающий объект покидает экран, он также перерабатывается. Теперь, когда создается еще один летающий объект и он бросает бомбу, код для утилизации бомбы получает дважды. Затем для третьего летающего объекта код для утилизации одной бомбы получает трижды и так далее.

AndEngine перемещать два объекта одновременно

Код для добавления летающий объект выглядит следующим образом

private void createDragonHandler() { 
    TimerHandler spriteTimerHandler; 
    float mEffectSpawnDelay = 10f; 
    spriteTimerHandler = new TimerHandler(mEffectSpawnDelay, true, 
      new ITimerCallback() { 
       @Override 
       public void onTimePassed(TimerHandler pTimerHandler) { 
        addDragon(); 
       } 
      }); 
    getEngine().registerUpdateHandler(spriteTimerHandler); 
} 


public void addDragon() { 
    Dragon dragon = (Dragon) dragonSpritePool.obtainPoolItem(); 
    if (dragon.getParent() != mainScene) 
     mainScene.attachChild(dragon); 
} 

public synchronized Dragon obtainPoolItem() { 
    dragon = super.obtainPoolItem(); 
    Random rand = new Random(); 
    final int x = (int) (CAMERA_WIDTH + resourceManager.dragonTextureRegion 
      .getWidth()); 
    int minY = (int) resourceManager.dragonTextureRegion.getHeight(); 
    int maxY = (int) (CAMERA_HEIGHT/2 - resourceManager.dragonTextureRegion 
      .getHeight()); 
    int rangeY = maxY - minY; 
    final int y = rand.nextInt(rangeY) + minY; 
    dragon.reset(); 
    dragon.setVisible(true); 
    dragon.setIgnoreUpdate(false); 
    dragon.animate(150); 
    dragon.setPosition(x, y); 
    MoveXModifier mod = new MoveXModifier(15, dragon.getX(), 
      -dragon.getWidth()); 
    float mEffectSpawnDelay = 5f; 
    TimerHandler spriteTimerHandler = new TimerHandler(mEffectSpawnDelay, 
      true, new ITimerCallback() { 
       @Override 
       public void onTimePassed(TimerHandler pTimerHandler) { 
        DragonFire dragonFire = BirdShoot.dragonFireSpritePool 
          .obtainPoolItem(dragon.getX(), dragon.getY()); 
        BirdShoot.mainScene.attachChild(dragonFire); 
       } 
      }); 
    dragon.registerEntityModifier(mod.deepCopy()); 
    dragon.setNoHit(0); 
    PhysicsHandler mPhysicsHandler; 
    mPhysicsHandler = new PhysicsHandler(dragon); 
    dragon.setPhysicsHandler(mPhysicsHandler); 
    dragon.registerUpdateHandler(dragon.getmPhysicsHandler()); 
    BirdShoot.engine.registerUpdateHandler(spriteTimerHandler); 
    return dragon; 
} 


`

+0

я хотел бы предложить U, чтобы получить возможность отправлять уры вопроса на HTTP: // WWW .andengine.org/forums – KOTIOS

+0

Он уже существует http://www.andengine.org/forums/tutorials/binding-two-objects-together-t12520.html, но ответа не получил :( – Chetna

+0

, пожалуйста, посмотрите на общий пул в andengine .. –

ответ

1

Где вы пишете код для утилизации объектов спрайтов? По вашей проблеме я вижу там что-то подозрительное. Возможно, что код не выполняется. Код для переработки спрайтов должен быть что-то вроде этого: -

public void onHandleRecycleItem(Sprite sprite){ 
    super.onHandleRecycleItem(sprite); 
    // Your code to recycle the object  
} 

Также следует назвать, используя следующую строку:

yourPool.recyclePoolItem(spriteObject); 
0

Не видя кода, это будет трудно, чтобы помочь с этим. Но у этого есть запах вещей, которые не делаются на updateThread.

Каждый раз, когда вы делаете что-то, что влияет на AndEngine, убедитесь, что вы называете его через

runOnUpdateThread(new Runnable() { 

    @Override 
    public void run() { 
    /* Do your AndEngine changes in here*/ 
    } 
});` 
+0

Вещи делаются в потоке обновления, потому что я не получаю никаких исключений. его работа не считается презумпцией. Я отредактировал мой вопрос, чтобы включить код. – Chetna

Смежные вопросы