我正在使用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;
}
`
答案 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*/
}
});`