1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

cocos2d::Vector の初期化時に要素の追加もしちゃう、ちょっとした魔改造

Last updated at Posted at 2014-12-20

注意 : Visual Studio 2012 を使うプロジェクトでは使えません。2013 以降をお使いください。

cocos2d::Vector って pushBack したりすると勝手に retainrelease を呼んでくれて便利ですよね。
(そもそも retainrelease をさせるメモリ管理が鬱陶しいというのは置いておいて。)
そんな cocos2d::Vector の生成をちょっと便利にしちゃう魔改造をご紹介します。

材料はいたってシンプル。
cocos2d/cocos/base/CCVector.h だけを調理します。

まずは最初に必要な物を読み込んじゃいましょう。

CCVector.h
// ...

#include <functional>
#include <algorithm> // for std::find

// 追加する行
#include <initializer_list>

NS_CC_BEGIN
// ...

必要な材料が準備できたらあとはコンストラクタを用意するだけです。
こんな感じに。

CCVector.h
// ...
    /** 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初投稿ネタに使った記事でした。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?