触摸时删除连续的生成精灵

时间:2012-10-22 08:50:26

标签: android andengine game-engine

我是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创建新的精灵。

我不确定在哪里为特定的触摸精灵编写代码并将其删除。

1 个答案:

答案 0 :(得分: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;
}

并删除Sprite方法应该是:

// ==============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();
        }
    });
}

要创建连续的Spawn Sprite,我在此方法中使用时间处理程序。下面的方法应该在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());


}

希望这对其他人也有帮助!