Cocos2dxを使っていて他クラスのメンバを参照したくなったときはどうすればいいですか?
たとえばAppleクラスからBananaクラスのseedメンバを参照する時、自分はAppleクラスの中でBanana::create()->seedとやって呼び出していました。CREATE_FUNCの中身を見るとこうすることでBananaクラスの実体にアクセスできる気がしたので…
しかし、最近気づいたのですが、この方法だとBananaクラスを呼び出すたびにBananaクラスのinit()関数が実行されているのです。vectorのサイズが異常に大きくなっていたので気づきました。
そこで質問なのですが、cocos2dxには他クラスのメンバを参照できるような仕組みはありますか?自分の方法以外で、何かいい方法はないでしょうか。
ここから追記です。あれから考えたのですが、要するにinit()関数を呼ばずに参照したいクラスのアドレスを
取得できればいいので、以下のようにしました。(seedはspriteです)
c++
1cocos2d::Layer* bananaLayer; 2 3bool GameScene::init(){ 4 if(!Scene::init()) 5 return false; 6 7 bananaLayer = banana::create(); 8 this->addChild(bananaLayer); 9 10 return true; 11} 12 13bool apple::init(){ 14 if(!layer::init()) 15 return false; 16 17 bananaLayer->seed->getPosition(); 18 19 return true; 20}
このようにグローバル変数を使わざるを得ませんでした。気持ち悪いですが...
逆に、
c++
1bool apple::init(){ 2 if(!layer::init()) 3 return false; 4 5 auto bananaLayer = new banana; 6 bananaLayer->seed->getPosition(); 7 8 return true; 9}
とやってもうまく行きませんでした。
これって、新しく宣言したbananaLayerはメモリが与えられただけでinit()されてないので、
init()内にあるseed = Sprite::create()も実行されていないのが原因なんじゃないでしょうか?
つまり、seedというメンバはbananaLayerのメンバとしてアドレスをもらってはいるけど
spriteクラスとしての実体は持っていない、といったような。
c++のクラスとcocos2d::Nodeの違う点としては、このようにメンバの本当の意味での実体が
init()を実行しないと取得できないことだと勝手に解釈しています。
...とここまで書いてコンストラクタでinit()すればいいのか?とも思ったのですが、
c++でもあるインスタンスAのメンバにアクセスしたいときはそのインスタンスA自体を参照すればよくて、
新しい別のインスタンスBを宣言する必要はないですよね。
やっぱり大元のSceneにaddChild()するためにcreate()した時に返ってきたアドレスをなんらかの方法
で保持しておくしか方法はなくないですか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/02 16:43
2018/11/02 18:29
2018/11/11 15:38
2018/11/12 03:01
2018/11/12 16:24