AndEngine同时移动两个物体

时间:2013-07-22 05:54:54

标签: android andengine sprite game-physics

我正在使用Andengine创建一个游戏,在此我想要一个在天空中飞行的物体在下面投下炸弹。目前我正在使用计时器来创建飞行物体和炸弹。 但它不能正常工作。我面临的问题是:
1)有时候投下2或3枚炸弹而不是单枚炸弹。
2)炸弹对象也没有被回收。回收对象的代码被调用,但它似乎不起作用。

我注意到一件事,即假设,最初我有一个飞行物体掉落炸弹。当炸弹离开屏幕时,炸弹对象的回收代码被调用一次。在飞行物体离开屏幕的某个时间之后,它也会被回收。现在当另一个飞行物体被制造并且它掉落炸弹时,回收炸弹的代码被调用两次。然后对于第三个飞行物体,回收单个炸弹的代码被称为三次,依此类推。

添加飞行物体的代码如下

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


`

2 个答案:

答案 0 :(得分:1)

你在哪里编写用于回收精灵对象的代码?根据你的问题,我看到有些东西可疑。代码可能无法执行。回收sprite的代码必须是这样的: -

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

还应该使用以下行调用它:

 yourPool.recyclePoolItem(spriteObject);

答案 1 :(得分:0)

如果没有看到您的代码,就很难为此提供帮助。但是,这有一些没有在updateThread上完成的事情。

每当你做一些影响AndEngine的事情时,一定要通过

来调用它
runOnUpdateThread(new Runnable() {

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