cocos2d-xにPR送った
無事に通った、めでたい
何が良くなったか
PRを送ったのは、『CocosStudio』で作成したシーンをcocostudio::SceneReader
で読み込んだときの挙動。
今までは、CocosStudioで作成したシーンプロジェクトを読み込んだとき、その子ノードにアクセスするためには、タグを使ってアクセスする以外の方法がなかった。
auto scene = cocos2d::cocostudio::SceneReader::getInstance()->createNodeWithSceneFile("Scene.json"); // 子ノードを取るにはタグからアクセスする必要があった auto object = dynamic_cast<cocos2d::Sprite *>(scene->getChildByTag(42));
これは、いちいちタグを定数として定義しておいたりしないといけなくて見通しが悪く、使いづらい。
しかし、CocosStudioには各ノードに対してname
を付ける機能が存在する。
現状の実装では、name
が出力されるシーンファイルには書き出されているが、ノードとして読み込む際に、特にどこにも設定されずに捨てられていた。
一方、cocos2d-x 3.2からは、Node
に名前を付けることができるようになっていて、名前から子ノードが取り出せるAPIが提供された。
cocos2d-x: Node Class Reference
というわけで、このname
属性をそのままNode::name
として利用できるようにしたという話。
auto scene = cocos2d::cocostudio::SceneReader::getInstance()->createNodeWithSceneFile("Scene.json"); // CocosStudio上で設定したname属性からアクセスできるようになった!(ついでにテンプレートも使えるようになった!) auto object = scene->getChildByName<cocos2d::Sprite *>("objectName");
一方でGUIReaderの場合は
Node::name
プロパティはcocos2d-x 3.2から追加された新しいプロパティなので、対応が追いついていなかったのではないか、という好意的解釈もできるが、以下の点について説明が付かない。
SceneReader
と似た機能に、cocostudio::GUIReader
というクラスもある。
これは、CocosStudioのシーンプロジェクトではなく、UIプロジェクトをノードとして読み込むクラス。
しかし、似たような機能を持つGUIReader
では、Widget
を読み込むときにちゃんとname
属性を読んで名前からアクセスできるようになっていた。なぜなのか。(バージョン3.2で確認)
cocos2d-x/CCSGUIReader.cpp at 2210d1fe87c3dd7d2ce79d01945b85a0de24862d · cocos2d/cocos2d-x
// Widgetを読み込む auto widget = cocostudio::GUIReader::getInstance()->widgetFromJsonFile("Widget.json"); // ラベルのノードを取り出す auto atlas = widget->getChildByName<ui::TextAtlas *>("AtlasLabel");
cocos2d-xヤバい
前回と同じ結論だけど、使えば使うほど闇っぽい。
今回は似たような機能なのに、両者間で微妙に仕様が違うと言ったことが起きていた。
name
属性を引き継ぐかどうか、という話もそうだし、getChildByName
はテンプレートが利用できるのに、getChildByTag
はなぜかテンプレートが利用できない点とか。
何か、GitHub覗いてる感じ、来たお便利機能のPRを片っ端からマージしてるみたいな感じで、ロードマップとかあるのかなあと疑問に思ってしまう。
とはいえ、日々送りつけられ続ける大量のPull Requestをしっかりレビューして、保守管理しているデベロッパーさんには頭が上がらない。
次回予告
あと何個かネタがあるので気が向いたらPRを送りたい。バグ修正だけじゃなくて、「ぼくのかんがえた最強のAPI」みたいな感じで欲しいモノ作って送ってもちゃんと見てくれてる感じがあるので、どんどん貢献していきたいところですね。