5

私はAndEngineが初めてです。ランドスケープ モードで画面の高さよりも上からスプライトが多数生成されたシーンを作成しました。スプライトに触れたときにスプライトを削除したいと思います。問題は、画面に触れると最新のスプライトが削除され、タップしたスプライトを個別に削除できないことです。

これが私のコードです:

//======== TimerHandler for collision detection and cleaning up ======
IUpdateHandler detect = new IUpdateHandler() {
    @Override
    public void reset() {
    }

    @Override
    public void onUpdate(float pSecondsElapsed) {

        targets = targetLL.iterator();
        while (targets.hasNext()) {
            _target = targets.next();

            if (_target.getY() >= cameraHeight) {
                // removeSprite(_target, targets);
                tPool.recyclePoolItem(_target);
                targets.remove();
                Log.d("ok", "---------Looop Inside-----");
                // fail();
                break;

            }
            // i don't know whether below code is valid for this postion
            mMainScene.setOnSceneTouchListener(new IOnSceneTouchListener() {
            @Override
                public boolean onSceneTouchEvent(Scene arg0,
                        TouchEvent pSceneTouchEvent) {

                    try {
                        // i can't use this two
                        final float touchX = pSceneTouchEvent.getX();
                        final float touchY = pSceneTouchEvent.getY();

                        if (pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN) {
                            //call to remove sprite
                            removeSprite(_target, targets);
                        }
                    } catch (ArrayIndexOutOfBoundsException e) {
                        e.printStackTrace();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return true;
                }
            });
        }
        targetLL.addAll(TargetsToBeAdded);
        TargetsToBeAdded.clear();

    }
};

ターゲットを追加するコード:

/** adds a target at a random location and let it move along the y-axis */
public void addTarget() {
    Random rand = new Random();

    int minX = mTargetTextureRegion.getWidth();
    int maxX = (int) (mCamera.getWidth() - mTargetTextureRegion.getWidth());
    int rangeX = maxX - minX;
    Log.d("----point----", "minX:" + minX + "maxX:" + maxX + "rangeX:"
            + rangeX);

    int rX = rand.nextInt(rangeX) + minX;
    int rY = (int) mCamera.getHeight() + mTargetTextureRegion.getHeight();

    Log.d("---Random x----", "Random x" + rX + "Random y" + rY);

    //HERE I USE POOL TO CREATE NEW SPRITE
    //tPool is object of TargetsPool Class
    target = tPool.obtainPoolItem();
    target.setPosition(rX, rY);

    target.animate(100);
    mMainScene.attachChild(target, 1);
    mMainScene.registerTouchArea(target);

    int minDuration = 2;
    int maxDuration = 32;
    int rangeDuration = maxDuration - minDuration;
    int actualDuration = rand.nextInt(rangeDuration) + minDuration;

    // MoveXModifier mod = new MoveXModifier(actualDuration, target.getX(),
    // -target.getWidth());

    MoveYModifier mody = new MoveYModifier(actualDuration,
            -target.getHeight(), cameraHeight + 10);
    target.registerEntityModifier(mody.deepCopy());
    TargetsToBeAdded.add(target);

}

タッチ時にスプライトを削除するコード:

// ==============the method to remove sprite=====================
public void removeSprite(final AnimatedSprite _sprite, Iterator it) {
    runOnUpdateThread(new Runnable() {

        @Override
        public void run() {
            _target = _sprite;
            mMainScene.detachChild(_target);
        }
    });
    it.remove();
}

GenericPool を使用して新しいスプライトを作成します。

特定のタッチされたスプライトのコードを記述して削除する必要がある場所がわかりません。

4

1 に答える 1

1

ああ..ここで解決策を見つけました。

BaseGameActivity クラスに IOnAreaTouchListener を実装しました。したがって、私のクラス宣言は次のようになります。

public class CrazyMonkeyActivity extends BaseGameActivity implements
    IOnAreaTouchListener

そして私のオーバーライドメソッドは次のようになります:

@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
        final ITouchArea pTouchArea, final float pTouchAreaLocalX,
        final float pTouchAreaLocalY) {

    if (pSceneTouchEvent.isActionDown()) {
        this.removeSprite((AnimatedSprite) pTouchArea);
        return true;
    }

    return false;
}

スプライトのメソッドを削除すると、次のようになります。

// ==============the method to remove spirit=====================
public void removeSprite(final AnimatedSprite target) {
    runOnUpdateThread(new Runnable() {
        @Override
        public void run() {
            mMainScene.detachChild(target);
            mMainScene.unregisterTouchArea(target);
            System.gc();
        }
    });
}

継続的なスポーン スプライトを作成するには、このメソッド内で時間ハンドラを使用します。以下のメソッドは onLoadScene() メソッド内で呼び出す必要があります。

/** a Time Handler for spawning targets Sprites, triggers every 2 second */
private void createSpriteSpawnTimeHandler() {
    TimerHandler spriteTimerHandler;
    float mEffectSpawnDelay = 2f;

    spriteTimerHandler = new TimerHandler(mEffectSpawnDelay, true,
            new ITimerCallback() {
                @Override
                public void onTimePassed(TimerHandler pTimerHandler) {
                        //position for random sprite
                    final float xPos = MathUtils.random(30.0f,
                            (cameraWidth - 30.0f));
                    final float yPos = MathUtils.random(30.0f,
                            (cameraHeight - 30.0f));
                    //below method call for new sprite
                    addTarget(xPos, yPos);

                }

            });
    getEngine().registerUpdateHandler(spriteTimerHandler);
}

addTarget() は次のようになります。

public void addTarget(float xPos, float yPos) {
    Random rand = new Random();
    Log.d("---Random x----", "Random x" + xPos + "Random y" + yPos);

    target = new AnimatedSprite(xPos, yPos, mTargetTextureRegion);
    target.animate(100);
    mMainScene.attachChild(target);
    mMainScene.registerTouchArea(target);

    int minDuration = 2;
    int maxDuration = 32;
    int rangeDuration = maxDuration - minDuration;
    int actualDuration = rand.nextInt(rangeDuration) + minDuration;

    MoveYModifier mody = new MoveYModifier(actualDuration,
            -target.getHeight(), cameraHeight + 10);
    target.registerEntityModifier(mody.deepCopy());


}

これが他の人にも役立つことを願っています!

于 2012-10-23T14:21:21.800 に答える