cocos 2dx メモ(整理するまでcppのないようも含んでると思う

xcodeで作ったクラスをandroid用にビルドする時には、Android.mkにクラス名を追加

HelloCocos/proj.android-studio/Android.mk

android-studioでビルドしているのでこのディレクトリは以下のAndroid.mkを編集する

LOCAL_SRC_FILESにcpp名を追加する

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../../Classes/AppDelegate.cpp \
                   ../../../Classes/HelloWorldScene.cpp \
                   ../../../Classes/LogoScene.cpp \
                   ../../../Classes/MainMenuScene.cpp \
                   ../../../Classes/HighScoreScene.cpp

android用にビルド

cocos2d-x-3.10//tools/cocos2d-console/bin/cocos run -s ~/snk_cocos/snk -p android --android-studio

毎フレ呼ばれるupdateメソッドを使う

事前にinitとかで以下のcocos2d::Node#scheduleUpdateを呼んでおく必要がある

this->scheduleUpdate();

updateメソッドがマイフレ使える

void update(float dt);

リファレンスカウンタ

snoopopo.hatenablog.com

インクルードガード、宣言と定義

・メンバがポインタの場合は、宣言でいい。定義はいらない=ヘッダをincludeしてクラスの定義を読み込む必要がない。

・引数、戻り値も宣言でいい。

・メンバが実態の場合は、定義を持つ必要がある。

・意識せずにヘッダを2回includeしててclassが二重定義になってエラった → インクルードガードすればOK。

⇒基本的に全部のヘッダはインクルードガードする!

#ifndefマクロは、xxが定義されてなければ #endifまでで囲った処理を実行する、という意味なので、 これで、クラスの定義が1度しか呼ばれないことになる。

#ifndef  _PART_H_
#define  _PART_H_ //1回目のみ呼ばれる

namespace cocos2d {
    class Vec2; //cocos2d::Vec2というクラスがあるよ、という宣言。Vec2はポインタで持っているので定義はいらない
}

class Part : public cocos2d::Node
{
    
public:
    Part(cocos2d::Vec2* pos);
    ~Part();
    Part* getPos();
    void setPos(Part* pos);
private:
    cocos2d::Vec2* _pos;
};

#endif // _PART_H_

rand()

cppでランダムな数値を取得するにはrand()が使える

rand() % 3;

上記の例は、0〜2までの値を取得できる。ランダムな数値を3で割った割った余は、0〜2の数字だからだ。

Action

cocos2dxにもlibgdxと同じでActionの概念がある。

・NodeにrunActionメソッドを持っているのでそれに登録してあげればいい。

//3秒で180度回転。単位は「度」でOK
runAction(RotateBy::create(3, 180));

・上記のままだと等速で処理を行うのでだんだんはやくしたりとかしたい場合はイージングを設定する

runAction(EaseIn::create(RotateBy::create(3, 180), 2));

・単純にxxの処理をしたい、という場合はCallFuncNを使う

    auto print = CallFuncN::create([this](Node* node){
        printf("aaaaaa");
    });

・シーケンス 順次実行 Sequence

auto rotate = EaseIn::create(RotateBy::create(3, 180), 2);
auto scale = EaseIn::create(ScaleBy::create(1, 0.5f), 3);
auto action = Sequence::create(rotate, scale, NULL); //最後は必ずNULLを設定しないとダメ
    
runAction(action);