0

ゲームで弾丸を管理するためにプールを使用しています。唯一の問題は、衝突に関係していたためにリサイクルされたばかりのプールから Bullet が取得されたBody.setTransform()場合です。Bullet の位置は初期化時に使用してリセットされますが、Bullet のスプライトの位置 ( を使用して衝突を検出するために使用されますSprite.collidesWith(otherSprite)) は十分な速さでリセットされません (物理スレッドで更新されるため)。これは、新しく作成された弾丸が作成された瞬間に衝突を引き起こし、単一の弾丸が複数の衝突を引き起こすことを意味します。

初期化時に呼び出してみBullet.sprite.setPosition(0,0)ましたが、そのコード行が配置されていると箇条書きがまったく表示されないため、これは明らかに干渉します。この問題を防ぐにはどうすればよいですか?

弾丸の作成:

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

1 に答える 1

0

onHandleObtainItemプールから弾丸を取得するために呼び出す頃に、あなたが何をしているのか興味があります。

呼び出すときにスプライトの位置を画面外の値に設定するのは意味がありませんかonHandleRecycleItem

@Override
protected void onHandleRecycleItem(final Bullet pBullet) {
    pBullet.disable();
    pBullet.getSprite().setPosition(-1, -1);
}
于 2011-09-01T09:38:10.760 に答える