当Sprite附加到Body时,我应该如何重置Sprite的位置?

时间:2011-08-31 22:04:06

标签: android multithreading collision-detection andengine

我正在使用游戏来管理游戏中的子弹。唯一的问题是当从刚刚被回收的池中获取子弹时,因为它涉及碰撞,虽然它的Body的位置在初始化时使用Body.setTransform()重置,子弹的Sprite的位置(用于使用Sprite.collidesWith(otherSprite)检测碰撞的速度不够快(因为它在物理线程中更新)。这意味着新创建的子弹在创建瞬间会导致冲突,从而导致单个子弹导致多个冲突。

我在初始化时尝试调用Bullet.sprite.setPosition(0,0),但这显然会产生干扰,因为Bullets根本无法显示该代码行。我该怎么做才能防止这个问题?

子弹创作:

bullets[bulletCounter] = bulletPool.obtainPoolItem();
bullets[bulletCounter].getBody().setTransform(shipBody.getTransform().getPosition(),0);
bullets[bulletCounter].getBody().setLinearVelocity(shipBody.getLinearVelocity());
bullets[bulletCounter].activate();

碰撞检测:

for(int i = 0; i < BULLET_MAX; i++){
    if(bullets[i] != null && bullets[i].isActive()){ 
        for(int j = 0; j < enemies.size(); j++){
            //check for collision!
            if(bullets[i].getSprite().collidesWith(enemies.get(j).getSprite())){
                //-snip-
                break;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我有兴趣看到你在调用onHandleObtainItem从池中获取子弹时所做的事情。

当您调用onHandleRecycleItem 时,将精灵位置设置为某个屏幕外值是没有意义的,例如:

@Override
protected void onHandleRecycleItem(final Bullet pBullet) {
    pBullet.disable();
    pBullet.getSprite().setPosition(-1, -1);
}