3

私は Andengine を使用してゲームを作成しています。このゲームでは、空を飛んでいるオブジェクトが下に爆弾を落とすようにします。現在、タイムハンドラーを使用して、飛行物体と爆弾の両方を作成しています。しかし、それは正しく機能していません。私が直面している問題は次のとおりです。
1) 1 つの爆弾の代わりに 2 つまたは 3 つの爆弾が投下されることがあります。
2) また、爆弾オブジェクトもリサイクルされていません。オブジェクトをリサイクルするためのコードが呼び出されていますが、機能していないようです。

たとえば、最初に爆弾を投下する飛行物体が 1 つあるとします。爆弾が画面から離れると、爆弾オブジェクトのリサイクル コードが 1 回呼び出されます。そして、飛行物体が画面を離れると、それもリサイクルされます。別の飛行物体が作成されて爆弾が投下されると、爆弾をリサイクルするためのコードが 2 回呼び出されます。次に、3 番目の飛行物体では、1 つの爆弾をリサイクルするためのコードが 3 回呼び出されます。

飛行物体を追加するコードは次のとおりです。

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;
}


`

4

2 に答える 2