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でググると嫌味なほどヒットするので、その中からいい感じのやつを探してくださいな。
日々修行ですね。やっぱ。
0 件のコメント:
コメントを投稿