私は 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;
}
`