1

皆さん、ここに私のジレンマがあります。

私は、アニメーション リスナーを使用して使用しているアニメーション スプライトを持っており、アニメーションがいつ終了したか、または最後のフレームであるかを知ることができます。

アニメーションが最後のフレームにあるとき、衝突しているオブジェクトを削除したいと思います。

だからここに私が今抱えている問題があります:

衝突を検出するために TimeHandler を使用していますが、問題はランダムな量の取り外し可能なオブジェクトがゲームに追加されていることです。ロード時にシーンに追加されると、それらを LinkedList に追加します。

次に、TimeHandler で、このような衝突を検出しようとします。

   mEngine.registerUpdateHandler(new TimerHandler(.005f, true,
        new ITimerCallback() {
          @Override
          public void onTimePassed(final TimerHandler pTimerHandler) {

            if (frames == 1) {

              if (woodSprites.hasNext()) {

                Sprite sprite = woodSprites.next();
                if (bombSprite.collidesWith(sprite)) {
                  Log.e("Frame", "Collision");
                  removeFace(sprite);

                }
              }
            }

          }

        }));

このアプローチの問題点は、爆弾スプライトがイテレータの次ではない取り外し可能なスプライトと衝突した場合、衝突を検出せず、何も起こらないことです。衝突が発生したときに、その特定の取り外し可能なスプライトを削除できるようにする必要があります

これを機能させるための提案を知っている人はいますか?

4

2 に答える 2

3

TimerHandler を使用する理由がわかりません。適切なフレームが欠落し続ける可能性があるため、パフォーマンスが非常に悪くなる可能性があります。パフォーマンスを向上させるためにやっていますか?このコードを試してください:

mEngine.registerUpdateHandler(new IUpdateHandler() {

    @Override
    public void reset() {}

    @Override
    public void onUpdate(float pSecondsElapsed) {
        if (frames == 1) {
            for (Sprite s : woodSprites) {
                if (bombSprite.collidesWith(s)) {
                    removeFace(s);
                }
            }
    }
});

パフォーマンスへの影響は無視できるはずだと思います。

于 2012-10-03T09:39:17.720 に答える
0

私が問題を正しく理解していれば、あなたはリストをざっと見て回ることはありません。それが、1 つの要素だけとの衝突を検出しようとしている理由です。試す:

while (woodSprites.hasNext()) {
    if (bombSprite.collidesWith(woodSprites)) {
        Log.e("Frame", "Collision");
        removeFace(woodSprites);
    }
}
于 2012-10-03T09:33:56.153 に答える