【cocos2dx】アラートやサブ画面を出す時に使えるタッチ処理

【cocos2dx】アラートやサブ画面を出す時に使えるタッチ処理
   

今回と次回のエントリーは、私が他のアプリを見て、「これってどう実装しているのか」一度試してみたかったことを紹介します。
まず最初のお題は、「自作でアラートやサブ画面を作るときの処理」です。

言葉ではどういうものか言うのが難しいのですが、こんな感じのヤツです。

2013-12-11-ddassa

Yahoo! JAPAN インターネット クリエイティブアワード 2013 – Yahoo! JAPANに選出された「コインクロス」です。

コインクロス – お金のロジックパズル App
カテゴリ: ゲーム

価格: 無料


これで、画面をポーズしたり、またアラート形式でPlayerに案内などができます。

やりたいこと

こんな感じの実装です。
  1. ボタンを押す
  2. 別画面が出て、今の画面が半透明で暗くなる
  3. 別画面がのボタンが押せる、元の画面のボタンが押せない

1〜2は、特に難しくないのですが、3をするのは少し工夫が必要です。
では、3の部分を実装します。

実装

このやり方は、このcocos2dのレシピ本に載っています。
タッチイベントの優先順位をCCTouchDispacherクラスを使い調整してあげればいいだけです。

具体的には、以下のようになります。


bool SubLayer :: init(){

     if(!CCLayer::init()){


          return false;

     }


    
    this->setTouchPriority(-1);
    this->setTouchEnabled(true);
    this->setTouchMode(kCCTouchesOneByOne);


     /**

     ボタンの実装は省いています。
     item1で作成しています。

     **/
    CCMenu *pMenu = CCMenu::create(item1,NULL);
  
    //ここで、レイアーよりCCMenuのボタンの方が優先順位が高いようにします。
    pMenu->setTouchPriority(-2);
    pMenu->setPosition(CCPointZero);
    this->addChild(pMenu,5);




//trueにすることで、タッチした処理を全て、このレイアーの処理にします。
bool SubLayer::ccTouchBegan(CCTouch*touch, CCEvent*event){
    
    return true;
}



まずは、ccTouchBegan()内で、trueを返すことで、タッチ処理を全てこのSubLayerで処理するようにします。
次に、SubLayerでのタッチの優先順位を調整。
CCMenuをレイアーより優先順位を高くしたらいいだけです。
これは、setTouchPriority()を使い設定します。数字が低いほど優先順位が高いです。

これで完了です。

IMG 0388

わかりにくいですが、赤で囲ったところがSubLayerです。

半透明にするには

元の画面を半透明にするには、SubLayerにCCLayerColorを追加してあげれば簡単にできます。


    CCLayerColor* foreground = CCLayerColor::create(ccc4(0, 0, 0, 127), size.width, size.height);
    this->addChild(foreground, 2);



最後に

これでだいたい思ったとおりのことができますが、一点付け加えるとしたら、SubLayerが出てくる時に何かアニメーションなりエフェクトなり入れると見映えがします。
これは、CCActionクラスを使えば恐らくできると思います。
こちらは、是非チャレンジをしてみて下さい。

Related Posts Plugin for WordPress, Blogger...