いちおくまんえん

最近はcocos2d-xでゲームアプリ「いちおくまんえん」の制作がメインです。 あとアニメも少々・・

プロローグ画面作成② ゲームロジック追加 cocos2d::Arrayの使用

ようやくプロローグも完成したのでちょっとゲームらしくなりました。


ゲームアプリ「いちおくまんえん」制作過程02 プロローグほぼ完成 - YouTube

やっぱり動画はいいですね。

すごく良く分かる(*‘ω‘ *)


最近の動画は16:9だからと思って合わせてエンコードしたけど結局、黒帯入っててそんな意味なかったw

iPhone4inchだと縦長すぎて横がすっごい無駄になっちゃうんですよね。
一応ログ吐くようにして流してはいるけど味気ない(;´∀`)

せめて毎回同じ画面の大きさと配置で撮影したいんですが、何かいいキャプチャソフトありませんかね。


と、動画の話は置いておいて、開発のお話。

今回はプロローグのメッセージの更新にcocos2d::Arrayを使用しました。
ほんとはstd::vectorとかの方が慣れているんですがせっかくcocos2d-x使ってるんだしということでcocos2d::Arrayの使い方。
version3系でクラス名のCCが取れてしまって単体で書くと不安になりますね(゚A゚;)
一応version2系からのプロジェクトにも対応できるようにCCDeprecated.hで恐らくほぼ全てにCCが付いていた頃のクラス名がtyoedefされてたりします。

CCDeprecated.h

CC_DEPRECATED_ATTRIBUTE typedef Image CCImage;
CC_DEPRECATED_ATTRIBUTE typedef UserDefault CCUserDefault;

CC_DEPRECATED_ATTRIBUTE typedef Action CCAction;
CC_DEPRECATED_ATTRIBUTE typedef FiniteTimeAction CCFiniteTimeAction;
CC_DEPRECATED_ATTRIBUTE typedef Speed CCSpeed;
CC_DEPRECATED_ATTRIBUTE typedef Follow CCFollow;
CC_DEPRECATED_ATTRIBUTE typedef GLProgram CCGLProgram;
CC_DEPRECATED_ATTRIBUTE typedef Touch CCTouch;
CC_DEPRECATED_ATTRIBUTE typedef Set CCSet;
CC_DEPRECATED_ATTRIBUTE typedef Texture2D CCTexture2D;
CC_DEPRECATED_ATTRIBUTE typedef Node CCNode;
CC_DEPRECATED_ATTRIBUTE typedef NodeRGBA CCNodeRGBA;
CC_DEPRECATED_ATTRIBUTE typedef RGBAProtocol CCRGBAProtocol;
CC_DEPRECATED_ATTRIBUTE typedef SpriteFrame CCSpriteFrame;
CC_DEPRECATED_ATTRIBUTE typedef AnimationFrame CCAnimationFrame;
CC_DEPRECATED_ATTRIBUTE typedef Animation CCAnimation;
CC_DEPRECATED_ATTRIBUTE typedef ActionInterval CCActionInterval;
CC_DEPRECATED_ATTRIBUTE typedef Sequence CCSequence;
CC_DEPRECATED_ATTRIBUTE typedef Repeat CCRepeat;
CC_DEPRECATED_ATTRIBUTE typedef RepeatForever CCRepeatForever;
CC_DEPRECATED_ATTRIBUTE typedef Spawn CCSpawn;
CC_DEPRECATED_ATTRIBUTE typedef RotateTo CCRotateTo;
CC_DEPRECATED_ATTRIBUTE typedef RotateBy CCRotateBy;
CC_DEPRECATED_ATTRIBUTE typedef MoveBy CCMoveBy;

こんな感じで。

なのでCCArrayとか書いてても動くんですが、恐らく移行期間として一時的に用意してくれてるだけだと思うのでCCは付けないようにしていきましょう。

ではArrayの使い方

// ヘッダーでメンバ変数用意
// メッセージの配列
cocos2d::Array* _messageArray;

// 実装側
// コンストラクタで初期化
PrologueScene::PrologueScene()
: _messageArray(nullptr)
{
    // こっちで初期化するより上のコロンで繋げて書いている方が余計な処理が入らない分軽くなるそう
}

// デストラクタで開放するようにする。これしないとメモリリークすると思います。たぶん。
// この書き方であってると思うけど自信はない(´・ω・`)cocos2d内でよく見る書き方に合わせた感じ
PrologueScene::~PrologueScene()
{
    if (_messageArray != nullptr)
    {
        // 中身空にして
        _messageArray->removeAllObjects();
        // 参照カウンタ減らして0(誰からも参照されていない)になってたらdelete
        CC_SAFE_RELEASE(_messageArray);
        // CC_SAFE_RELEASE_NULLの方が最後に=nullptrしてくれるのでいいかもしれない
    }
}

// 中身を作ってあげる
_messageArray = Array::create(
        ccs("お金持ちになりたい"),
        ccs("それは多くの人が\n子供の頃に持つ夢。"),
        ccs("ただ、多くの人は\n\nなれたらいいな\n\nという願望に留まってしまう。"),
        ccs("お金は生きていく分だけ\nあれば良い。"),
        ccs("その生きていく分をどのようにして取得するかを考え始める。"),
        ccs("自分の好きなことをしたい。"),
        ccs("人に喜んでもらいたい。"),
        ccs("家族との時間を大切にしたい。"),
        ccs("それぞれの想いから、\nみな仕事を選び働く。"),
        ccs("その結果\n\n運良くお金持ちになれた。\n\nという人もいるかもしれない。"),
        ccs("しかし"),
        ccs("お金のことを再優先に考え"),
        ccs("お金持ちになりたい\n\nという夢を実現するべく\n努力し続ける人もいる。"),
        ccs("この物語は\n\nお金持ちになりたいと願い。"),
        ccs("そして、その夢を追い続ける。"),
        ccs("そんな\n\nある一人の少女のお話。"),
        NULL);
// retain(参照カウンタをインクリメント)してあげないとこのブロック抜けたら消えてしまう
_messageArray->retain();

// ちなみにccs("hoge")はこう定義されてます
#define StringMake(str) String::create(str)
#define ccs               StringMake

// なので_messageArrayはStringオブジェクトの配列になっています。
// 最後のNULLは終わったよの合図です。

// Array要素の取得方法
// Object型で返ってくるので自分の入れた型のメソッドが使いたい場合は適宜キャストします
String* message = static_cast<String*>(_messageArray->getObjectAtIndex(_messageIndex));
// この例ではLabelTTFのテキストを更新しています
_messageTTF->setString(message->getCString());

とまぁこんな感じで使えます。

通常は↓みたいな使いかただと思いますが。

auto array = Array::create();
for (int i = 0; i < hoge; ++i)
{
    array->addObject(Object);
}


今回のコミットログ
https://github.com/yasuhiro-matsuda/ichi_okuman_yen/commit/621e12aef76f5c5b1b88ddfa8b0d1b5b48e0a26c

次はストーリー部分なのでちゃんと考えて実装しないと(´゚д゚`)