AndEngineのParticleSystemとTMXTiledMapを使う

 作成中のアプリ「ぞろぞろ」の髭はパーティクルで生成しています。
 パラメータを設定しておけば自動でぞろぞろ生えてくるので便利なのですが、顔の部分部分で髭の濃淡を付けるのには、それぞれのパラメータが必要です。
 
 そこで、480×800 の画面を8ピクセル方形の 60×100 に分割して顔のガイドラインに沿って右5段階、左5段階の濃淡を付けるマップを作成しました。右と左とに分けたのは、髭の生える方向が違うから。
 

		int[] particles		= {25, 20, 15, 10,  5,  5, 10, 15, 20, 25}; // 密度
		float[] scaleXMax 	= {0.2f, 0.15f, 0.15f, 0.1f, 0.1f, 0.1f, 0.1f, 0.15f, 0.15f, 0.2f}; // 太さ
		float[] scaleYMax 	= {0.35f, 0.3f, 0.25f, 0.2f, 0.15f, 0.15f, 0.2f, 0.25f, 0.3f, 0.35f}; // 長さ

		int id;
		for(int i = 0 ; i < 60 ; i++){
			for(int j = 0 ; j < 100; j++){
				// TMXTiledMap faceMap から設定値を読み込む
				id = faceMap.getTMXLayers().get(0).getTMXTile(i, j).getGlobalTileID();
				if(id > 0){ // id = 0 は設定なし

					// エミッターで位置と大きさを設定 RectangleParticleEmitter(float pCenterX, float pCenterY, float pWidth, float pHeight)
					final RectangleParticleEmitter pe = new RectangleParticleEmitter((i*8)+4, ((100-j)*8)+4, 8, 8);

					// サンプルと同じ BatchedPseudoSpriteParticleSystem を使用
					// BatchedPseudoSpriteParticleSystem(IParticleEmitter pParticleEmitter, float pRateMinimum, float pRateMaximum, int pParticlesMaximum, ITextureRegion pTextureRegion, VertexBufferObjectManager pVertexBufferObjectManager)
					BatchedPseudoSpriteParticleSystem ps = new BatchedPseudoSpriteParticleSystem(pe, 10, 30, particles[id-1], resourcesManager.higeParticleTexture_region, vbom);

					// setBlendFunction(int pBlendFunctionSource, int pBlendFunctionDestination) ・・わからん・・
					ps.setBlendFunction(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE);

					// カラー初期値 ColorParticleInitializer<Entity>(float pMinRed, float pMaxRed, float pMinGreen, float pMaxGreen, float pMinBlue, float pMaxBlue)
					ps.addParticleInitializer(new ColorParticleInitializer<Entity>(0.1f, 0.2f, 0.1f, 0.2f, 0.1f, 0.2f));

					// 透明度初期値 AlphaParticleInitializer.AlphaParticleInitializer<Entity>(float pMinAlpha, float pMaxAlpha)
					ps.addParticleInitializer(new AlphaParticleInitializer<Entity>(0.5f, 0.8f));

					// 回転範囲 RotationParticleInitializer.RotationParticleInitializer<Entity>(float pMinRotation, float pMaxRotation) 右と左で振り分け
					if(id <= 5) ps.addParticleInitializer(new RotationParticleInitializer<Entity>(175.0f, 215.0f));
					else 		ps.addParticleInitializer(new RotationParticleInitializer<Entity>(155.0f, 195.0f));

					// 寿命 ExpireParticleInitializer<Entity>(float pLifeTime)
					ps.addParticleInitializer(new ExpireParticleInitializer<Entity>(240f));

					// スケール変化 ScaleParticleModifier<Entity>(float pFromTime, float pToTime, float pFromScaleX, float pToScaleX, float pFromScaleY, float pToScaleY)
					ps.addParticleModifier(new ScaleParticleModifier&amp;lt;Entity&amp;gt;(0f, 90f, 0.0f, scaleXMax[id-1], 0.0f, scaleYMax[id-1]));

					// 透明度変化 AlphaParticleModifier<Entity>(float pFromTime, float pToTime, float pFromAlpha, float pToAlpha)
					ps.addParticleModifier(new AlphaParticleModifier<Entity>(0f, 90f, 0.5f, 0.8f));
					ps.setTag(j*100 + i + TAG_PS);
					attachChild(ps);

					// 停止しておく setParticlesSpawnEnabled(boolean pParticlesSpawnEnabled)
					ps.setParticlesSpawnEnabled(false);
				}
			}
		}

 こうなった。
device-2015-01-18-201812
 真正面からの写真なら、もっとうまくフィットします。
 画面タッチした部分のパーティクルシステムをリセットして髭剃りにも対応したので
device-2015-01-18-201910
リンカーン風にもできます。
 
 あぁ、メモリが・・。