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);
リファレンスカウンタ
インクルードガード、宣言と定義
・メンバがポインタの場合は、宣言でいい。定義はいらない=ヘッダを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);