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

 以前作ったサンプルライブラリの内、MainActivity クラスと SceneManager クラスに変更はありません。
 
 新たな素材を読み込むため、ResourcesManager クラスに追記します。
 それぞれの BitmapTextureAtlas と ITextureRegion を用意して

	private BitmapTextureAtlas colaTextureAtlas;
	public ITextureRegion cola_region;
	private BitmapTextureAtlas maskTextureAtlas;
	public ITextureRegion mask_region;
	private BitmapTextureAtlas ninePatchTextureAtlas;
	public ITextureRegion ninePatch_region;

 画像を読み込みます。

	public void loadResources(){
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
        spriteTextureAtlas = new BitmapTextureAtlas(activity.getTextureManager(), 256, 256, TextureOptions.BILINEAR);
        sprite_region = BitmapTextureAtlasTextureRegionFactory.createFromAsset(spriteTextureAtlas, activity, "sprite.png", 0, 0);
        spriteTextureAtlas.load();
        colaTextureAtlas = new BitmapTextureAtlas(activity.getTextureManager(), 256, 256, TextureOptions.BILINEAR);
        cola_region = BitmapTextureAtlasTextureRegionFactory.createFromAsset(colaTextureAtlas, activity, "cola.png", 0, 0);
        colaTextureAtlas.load();
        maskTextureAtlas = new BitmapTextureAtlas(activity.getTextureManager(), 4, 4, TextureOptions.BILINEAR);
        mask_region = BitmapTextureAtlasTextureRegionFactory.createFromAsset(maskTextureAtlas, activity, "mask.png", 0, 0);
        maskTextureAtlas.load();
        ninePatchTextureAtlas = new BitmapTextureAtlas(activity.getTextureManager(), 16, 16, TextureOptions.BILINEAR);
        ninePatch_region = BitmapTextureAtlasTextureRegionFactory.createFromAsset(ninePatchTextureAtlas, activity, "ninePatch.png", 0, 0);
        ninePatchTextureAtlas.load();
	}

 
 シーン周りは大改造となります。
 先ずは、BaseScene クラス。
 ZoomCamera につられず、常に等倍・位置固定の Scene のサブクラス HUD クラスにダイアログを表示します。

	protected HUD hud;
	protected NineSliceSprite dialogSprite;
	private float scaleTime = 0.5f;

 今後 BaseScene のサブクラスが増えたときでもコードを加えることなくダイアログが表示できるよう、ここにメソッドを作ってしまいましょう。

	abstract void drawDialog(final float sec);

	protected void openDialog(final float x, final float y, final float width, final float height){
		attachMask();
		final float sec = scaleTime * (height / MainActivity.CAMERA_HEIGHT);
		dialogSprite = new NineSliceSprite(x, y, width, height, resourcesManager.ninePatch_region, 8, 8, 9, 9, vbom);
		ScaleModifier scaleModifier = new ScaleModifier(sec, 1.0f, 1.0f, 0.0f, 1.0f, new IEntityModifierListener(){
			public void onModifierStarted(IModifier<IEntity> pModifier, IEntity pItem){}
			public void onModifierFinished(IModifier<IEntity> pModifier, IEntity pItem){
				drawDialog(sec);
			}
		});
        scaleModifier.setAutoUnregisterWhenFinished(true);
		dialogSprite.registerEntityModifier(scaleModifier);
		hud.attachChild(dialogSprite);
	}

	protected void closeDialog(final float sec){
		ScaleModifier scaleModifier = new ScaleModifier(sec, 1.0f, 1.0f, 1.0f, 0.0f, new IEntityModifierListener(){
			public void onModifierFinished(IModifier<IEntity> pModifier, IEntity pItem){
				detachMask();
			}
			public void onModifierStarted(IModifier<IEntity> pModifier, IEntity pItem){}
		});
        scaleModifier.setAutoUnregisterWhenFinished(true);
		dialogSprite.registerEntityModifier(scaleModifier);
	}

	protected void attachMask(){
		final Sprite mask = new Sprite(MainActivity.CAMERA_WIDTH / 2, MainActivity.CAMERA_HEIGHT / 2, MainActivity.CAMERA_WIDTH, MainActivity.CAMERA_HEIGHT, resourcesManager.mask_region, vbom){
			@Override
			public boolean onAreaTouched(final TouchEvent pAreaTouchEvent, final float x, final float y){ 
				return true;
			}
		};
    	mask.setAlpha(0.5f);
    	hud.attachChild(mask);
		hud.registerTouchArea(mask);
		hud.setOnAreaTouchTraversalFrontToBack();
	}

	protected void detachMask(){
		hud.detachChildren();
		hud.clearTouchAreas();
	}

 openDialog() の最初に attachMask() を呼び出し、前面の全面に黒50%のマスクをかけ、onAreaTouched() の戻り値を true とすることで下のシーンにイベント通知しないようにしています。
 new NineSliceSprite(x, y, width, height, resourcesManager.ninePatch_region, 8, 8, 9, 9, vbom) でダイアログを作り、new ScaleModifier(sec, 1.0f, 1.0f, 0.0f, 1.0f, new IEntityModifierListener(){}) でY軸のスケールを0~1倍へと増やしていきます。終了した時点でダイアログの中身を描画する drawDialog() を呼び出すのですが、具体的には各シーンごとに実装します。
 closeDialog() は、その反対のことをしているだけですね。
 
 つづく。