LoginSignup
3
2

More than 5 years have passed since last update.

CocosStudioで作ったSpriteやボタンを再帰的に取得する

Last updated at Posted at 2016-01-09

ビルトイン関数では子Nodeしか探せない

cocos2d-jsでゲームを作るとき、UIはCocosStduioで作るとカンタンだ。
しかしCocosStduioで配置したSpriteやボタンを操作したいなら、外からそれらを取得しなければならない。
例えば配置したボタンに対し、Advanced→method→clickで関数名を書いた所で、そのボタンに関数を実装するのは外からやらねばならない。
この時、ボタンを取得するにはgetChildByTaggetChildByNameを使うのだが、名前から分かる通りこれらは子供しか探せない。
これだと、CocosStudioで複数のnodelayerを組み合わせてsceneを作ってccs.loadsceneを読み込んだとき、目的のボタンを探しだすのが面倒くさい。
cocos2dの構造はsceneを頂点とした木構造でDOMみたいなものなのだから、querySelectorとまでは言わずともせめてgetElementById的な物くらいはあってもいいのだが、どうやら見当たらないので実装しておくと便利だ。

子Nodeだけでなく子孫Nodeまで探索するfindNodeByName

findNodeByName.js
cc.Node.prototype.findNodeByName = function (name) {
    var result = this.getChildByName(name);
    if (!result) {
        var i, imax = this.childrenCount;
        for (i = 0; i < imax; i++) {
            var child = this.children[i];
            result = child.findNodeByName(name);
            if (result) {
                break;
            }
        }
    }
    return result;
}
findNodeByName.ts
(<cc.Node> cc.Node.prototype).findNodeByName = function(name):cc.Node{
    var result = this.getChildByName(name);
    if(!result){
        var i,imax=this.childrenCount;
        for(i=0;i<imax;i++){
            var child = this.children[i];
            result = child.findNodeByName(name);
            if(result){
                break;
            }
        }
    }
    return result;
}

CocosStudio上でSpriteやボタンを作成するとデフォルトで名前がつくが、これが一意でないと目当てのものとは違ったものが返ってくることがあるので注意。

使用例

var layerObj = ccs.load(res.json_layer);
var layer = layerObj.node;
var button_1 = layer.findNodeByName('Button1');
button_1.addClickEventListener(function(){
    // クリックした時の処理
});
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2