cocos2dでUITapGestureRecognizerを使おうと以下の実装をAppDelegateに追加しました
GameLayer *layer = [[[GameLayer scene] children] objectAtIndex:0];
UITapGestureRecognizer *gestureRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:layer action:@selector(handleTapFrom:)] autorelease];
[viewController.view addGestureRecognizer:gestureRecognizer];
で、ゲームの画面遷移的には以下のような流れとしていました。
タイトル画面(こいつが
AppDelegateで
runWithSceneされる)
→ ゲーム画面(ここでタップを検出する。上でいう
GameLayer)
→ 終了画面 → タイトル画面
タイトル画面では
CCMenuItemImageを使ってメニューを作成して、そのメニューが押されたらゲームが始まるという流れです。
で、ここで終了画面からタイトル画面に戻ると、
メニューを押しても反応しない。
メニューは確実に押されている(というのも
CCMenuItemImageは通常の画像と押されたときの画像を設定していて、メニューを押したときにちゃんと切り替わっている)のにも関わらず、selectorで設定したメソッドが呼ばれない。という状態に陥りました。
エラーが出るなら何とかなるんですが、ただただ反応しないだけなので、何が原因か全く分からない。
まぁ、
UITapGestureRecognizerだろうとあたりを付けて、その箇所を削除してみたらちゃんと動きますよ。
UITapGestureRecognizerがCCMenuItemをよりも先に反応してるんだろうなーというのは何となく想像ついたんですけど、どうしたらそれを回避できるのかの対策にどハマリしました。
開発時間は1日2時間程度とれたら良い方なので、正直4日くらい彷徨いました。
んで、何かの拍子に
stackoverflowにかなり良く似た現象を発見(それまでもstackoverflow見てたのに発見できなかったという)。
で、対策として如何ほど難しい実装をするんだろうと、その質問の回答をみたところ
「OK、言いたいことは分かった!
gestureRecognizer.cancelsTouchesInView = NO;
と書いてみなっ!!」(訳:オレ)
って3行が…
で、実際に意図する状態に出来ましたとさって話でした。
分かった後でcancelsTouchesInViewについて色々調べると、これ結構有名な話でして、いかに自分の検索脳力の低いかを痛感した次第で。。。
まぁ、実際にはコレだけ書いたらOKって訳ではないのですが、
そのあたりはcancelsTouchesInViewでググると嫌味なほどヒットするので、その中からいい感じのやつを探してくださいな。
日々修行ですね。やっぱ。