注意 : Visual Studio 2012 を使うプロジェクトでは使えません。2013 以降をお使いください。
cocos2d::Vector
って pushBack
したりすると勝手に retain
や release
を呼んでくれて便利ですよね。
(そもそも retain
や release
をさせるメモリ管理が鬱陶しいというのは置いておいて。)
そんな cocos2d::Vector
の生成をちょっと便利にしちゃう魔改造をご紹介します。
材料はいたってシンプル。
cocos2d/cocos/base/CCVector.h
だけを調理します。
まずは最初に必要な物を読み込んじゃいましょう。
// ...
#include <functional>
#include <algorithm> // for std::find
// 追加する行
#include <initializer_list>
NS_CC_BEGIN
// ...
必要な材料が準備できたらあとはコンストラクタを用意するだけです。
こんな感じに。
// ...
/** Constructor with initializer_list */
Vector<T>(std::initializer_list<T> list)
: _data(list)
{
static_assert(std::is_convertible<T, Ref*>::value, "Invalid Type for cocos2d::Vector<T>!");
addRefForAllObjects();
}
// ...
これで準備は整いました。早速使ってみましょう。
例えば、配列っぽく SpriteFrame
を保持しておきたいならこんな風にできます。
auto *cache = cocos2d::SpriteFrameCache::getInstance();
cocos2d::Vector<cocos2d::SpriteFrame*> frame{
cache->getSpriteFrameByName("foo"),
cache->getSpriteFrameByName("bar"),
cache->getSpriteFrameByName("buz"),
// ...
};
mySprite->setSpriteFrame(frame.at(0));
まるで配列の初期化をするように cocos2d::Vector
の初期値を設定できましたね。
魔改造に抵抗がある方、これを機に少し cocos2d-x に手を加えて
あなただけの cocos2d-x を作ってみるのもまた面白いと思いますよ。
それでは良い魔改造ライフを。
P.S. MSVC2012 が initializer_list に対応していなくて PR 弾かれちゃったので、Qiita初投稿ネタに使った記事でした。