AndEngineでアニメーション中のタッチイベントを制御する

 パズルゲーム「カラフルフロア」の問題面を作りながらバグ取りをしていて、コードの中身も段々と思い出してきました。
 最後まで悩んでいたのが、タッチイベント制御周りのエラーだった・・。
 
 フォァファファファ~(回想時のSE)
 
 このゲーム、プレーヤーと同じ色のパネルには移動できるというルールなので、画面をタッチして「行ける」と判定された場合は、プレーヤーをひょこひょこアニメーションさせてタッチしたパネルまで移動させています。
 始めは、まあ誰もがされるであろうタッチ時のフラグ boolean isTouchOK を作って制御していたのですが、タッチダウン:いけるかどうか判定→タッチアップ:行ければアニメーション開始・移動という処理中に頻繁にエラーが出るのです。

 調べてみると、タッチアップ後のロック処理 isTouchOK = false を先回りして次のタッチダウン処理に入ってしまう場合があることが判明。
 アニメーションの開始時に条件を付けてみたり(←今思えば、アニメーション開始後の制御が問題なのだから関係なかったね・・)したのですが、娘の超絶タッチ連打にはなす術もなくエラーとなりフリーズしてしまいます。娘はエラーを出そうとすさまじいタップをするのです。
 
 試行錯誤の末、たどり着いたのが次のコードです。

	float x, y;
	int mx, my, pastX, pastY;

	public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent){
		// 生座標値を取得
		x = pSceneTouchEvent.getX();
		y = pSceneTouchEvent.getY();

		// パネルの位置に変換
		mx = (int)Math.floor(((x - OFFSET_X) / (TILE_WIDTH / 2) + (y - (OFFSET_Y + 12)) / (TILE_HEIGHT / 2)) / -2);
		my = (int)Math.floor(((y - (OFFSET_Y + 12)) / (TILE_HEIGHT / 2) - (x - OFFSET_X) / (TILE_WIDTH / 2)) / -2);

		// ロックされていなければ処理開始
		// 生座標値の取得などが前にあるのは、実際のコードでは他にもいろいろ処理しているため
		if(isTouchOK){
			// タッチダウン時
			if (pSceneTouchEvent.isActionDown()){
				// pastX と pastY は前回タッチダウン時の mx と my
				// 前回とタッチ位置が異なり、アニメーションが動いていないで、範囲内であれば処理開始 X、Y はパネルの縦横最大数
				if(!(pastX == mx && pastY == my && player.isAnimationRunning()) && mx >= 0 && mx < X && my >= 0 && my < Y){
					// タッチダウン時の処理
					touchDown(mx, my);
					// 今回位置を格納
					pastX = mx;
					pastY = my;
				}
			}
			// タッチアップ時
			else if (pSceneTouchEvent.isActionUp()){
				// ロックして
				isTouchOK = false;
				// タッチダウン時と同じパネル位置で(実際には isActionMove 時の処理もあるので再度)範囲内なら処理開始
				if(pastX == mx && pastY == my && mx >= 0 && mx < X && my <= 0 && my < Y){
					// タッチアップ時の処理
					touchUp(mx, my);
					// アニメーション終了後にロックを解除して、前回値にダミーを入れる
					// isTouchOK = true;
					// pastX = -1;
					// pastY = -1;
				}
				else isTouchOK = true;
			}
		}
		return false;
	}

 これでエラーが激減しました。
 
 フォァファファファ~(回想時のSE)
 
 1年前に悩んでいたことが1年前のことのように思い出されます。

 ひとまず落ち着いているので更に直すつもりはないのですが、他の方々は、タッチイベントをキューに入れたりして任意のタイミングで取り出して処理しているようですね。よくわからんけど。

 しかし、でも、まだ、やはり、時たまフリーズするのです・・原因不明。