AndEngineでアニメーションダイアログを実装する(その3)

 前回からの続きです。
 
 SplashScene の変更は、BaseScene のメソッドをオーバーライドするだけ。エラーになるからね。

	@Override
	protected void drawDialog(final float sec){}

 
 GameScene は、

	@Override
	protected void createScene(){
		// 前回分に hud の処理を追記
		hud = new HUD();
		hud.setTouchAreaBindingOnActionDownEnabled(true);
		camera.setHUD(hud);
	}

	@Override
	public void disposeScene(){
		background.detachSelf();
		background.dispose();
		sprite.detachSelf();
		sprite.dispose();
		// hud の処理を追記
		hud.clearTouchAreas();
		hud.detachSelf();
		hud.dispose();
		this.detachSelf();
		this.dispose();
	}

	@Override
	public void onHold(HoldDetector pHoldDetector, long pHoldTimeMilliseconds, int pPointerID, float pHoldX, float pHoldY){
		if(!isHold && pHoldTimeMilliseconds > holdTime){
			isHold = true;
			// BaseScene のメソッド呼び出しに変更
			openDialog(MainActivity.CAMERA_WIDTH / 2, MainActivity.CAMERA_HEIGHT / 2, MainActivity.CAMERA_WIDTH - 300, MainActivity.CAMERA_HEIGHT - 400);
		}
	}

	// ダイアログの中身をここで書く
    @Override
	protected void drawDialog(final float sec){
    	Sprite colaSprite = new Sprite(dialogSprite.getWidth() / 2, dialogSprite.getHeight() / 2, resourcesManager.cola_region, vbom){
			@Override
			public boolean onAreaTouched(final TouchEvent pAreaTouchEvent, final float x, final float y){
				if(isTouchOK){
					if(pAreaTouchEvent.getAction() == TouchEvent.ACTION_UP){
						detachSelf();
						closeDialog(sec);
					}
				}
				return true;
			}
		};
    	dialogSprite.attachChild(colaSprite);
    	hud.registerTouchArea(colaSprite);
        isTouchOK = true;
	}

 コーラの Sprite の onAreaTouched() をオーバーライドして、自身をタッチされた時に自身を消した上でダイアログを閉じるようにしています。
 
 こんな感じで、サンプルプロジェクトを改造してみました。
 解凍してコードを見るもよし、Eclpse にインポートして動かすもよし(AndEngine の参照が必要です)。
 
 
と、満足していたら、問題発生。
 ロングタップしてダイアログが開いた後に指を離した際、離した位置にコーラが描画されていると即座にダイアログが閉じてしまう。
 ダイアログが開いた後に数秒の待ちを入れるか・・それでも指を離さなければダメだし・・、開いた後の最初の ACTION_UP で isTouchOK を true にしようか・・って、それじゃタッチイベント拾えないし、ACTION_DOWN で動作させようか・・。
 
 さあ、皆さんならどうします?
 
 つらつら考えて、一応の対応策はできたのですが、次回までの練習問題として?のままとしておきます。