Удалите непрерывный спрайтовый спрайт при касании

Я новичок в 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 для создания нового спрайта.

Я не уверен, где мне нужно написать код для конкретного спрайта спрайта и удалить его.

Solutions Collecting From Web of "Удалите непрерывный спрайтовый спрайт при касании"

Ох .. Я нашел решение здесь.

Я реализовал IOnAreaTouchListener в классе BaseGameActivity. Итак, моя декларация класса выглядит так:

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

Чтобы создать непрерывный Sprint 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()); } 

Надеюсь, это тоже поможет другим!