Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove continuous spawn sprite when touched

I am new with AndEngine. I just created a scene with many spawned sprites that come from above screen height in landscape mode. Now I want to remove a sprite when I touch on it. Problem is, when I touched the screen the most recent sprite is removed and I can't remove the tapped sprite individually.

Here is my code:

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

    }
};

code for adding target:

/** 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);

}

code for remove sprite when touched:

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

I use GenericPool to create new sprite.

I am not sure where I have to write code for the specific touched sprite and remove it.

like image 262
Shihab Uddin Avatar asked Nov 13 '22 19:11

Shihab Uddin


1 Answers

ohh.. I found the solution here.

I implemented an IOnAreaTouchListener in BaseGameActivity class. So, my class declaration looks like:

public class CrazyMonkeyActivity extends BaseGameActivity implements
    IOnAreaTouchListener

and my override method looks like:

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

And remove Sprite methods should be like:

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

To create continuous Spawn Sprite I use a time handler inside this method. Below method should be called inside onLoadScene() method:

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

And addTarget() looks like:

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());


}

Hope this might help others too!

like image 133
Shihab Uddin Avatar answered Nov 15 '22 12:11

Shihab Uddin