質問編集履歴

2

コードを載せました!よろしくお願いします。

2018/11/11 17:26

投稿

yaoriku_ava
yaoriku_ava

スコア25

test CHANGED
File without changes
test CHANGED
@@ -98,9 +98,9 @@
98
98
 
99
99
  init()内にあるseed = Sprite::create()も実行されていないのが原因なんじゃないでしょうか?
100
100
 
101
- つまり、bananaLayerのメンバとしてアドレスをもらってはいるけどspriteクラスとしての実体は
101
+ つまり、seedというメンバはbananaLayerのメンバとしてアドレスをもらってはいるけど
102
102
 
103
- 持っていない、といったような。
103
+ spriteクラスとしての実体は持っていない、といったような。
104
104
 
105
105
 
106
106
 

1

使ったコードを載せました。よろしくお願いします。

2018/11/11 17:26

投稿

yaoriku_ava
yaoriku_ava

スコア25

test CHANGED
File without changes
test CHANGED
@@ -11,3 +11,111 @@
11
11
 
12
12
 
13
13
  そこで質問なのですが、cocos2dxには他クラスのメンバを参照できるような仕組みはありますか?自分の方法以外で、何かいい方法はないでしょうか。
14
+
15
+
16
+
17
+ ここから追記です。あれから考えたのですが、要するにinit()関数を呼ばずに参照したいクラスのアドレスを
18
+
19
+ 取得できればいいので、以下のようにしました。(seedはspriteです)
20
+
21
+
22
+
23
+ ```c++
24
+
25
+ cocos2d::Layer* bananaLayer;
26
+
27
+
28
+
29
+ bool GameScene::init(){
30
+
31
+ if(!Scene::init())
32
+
33
+ return false;
34
+
35
+
36
+
37
+ bananaLayer = banana::create();
38
+
39
+ this->addChild(bananaLayer);
40
+
41
+
42
+
43
+ return true;
44
+
45
+ }
46
+
47
+
48
+
49
+ bool apple::init(){
50
+
51
+ if(!layer::init())
52
+
53
+ return false;
54
+
55
+
56
+
57
+ bananaLayer->seed->getPosition();
58
+
59
+
60
+
61
+ return true;
62
+
63
+ }
64
+
65
+ ```
66
+
67
+ このようにグローバル変数を使わざるを得ませんでした。気持ち悪いですが...
68
+
69
+
70
+
71
+ 逆に、
72
+
73
+ ```c++
74
+
75
+ bool apple::init(){
76
+
77
+ if(!layer::init())
78
+
79
+ return false;
80
+
81
+
82
+
83
+ auto bananaLayer = new banana;
84
+
85
+ bananaLayer->seed->getPosition();
86
+
87
+
88
+
89
+ return true;
90
+
91
+ }
92
+
93
+ ```
94
+
95
+ とやってもうまく行きませんでした。
96
+
97
+ これって、新しく宣言したbananaLayerはメモリが与えられただけでinit()されてないので、
98
+
99
+ init()内にあるseed = Sprite::create()も実行されていないのが原因なんじゃないでしょうか?
100
+
101
+ つまり、bananaLayerのメンバとしてアドレスをもらってはいるけどspriteクラスとしての実体は
102
+
103
+ 持っていない、といったような。
104
+
105
+
106
+
107
+ c++のクラスとcocos2d::Nodeの違う点としては、このようにメンバの本当の意味での実体が
108
+
109
+ init()を実行しないと取得できないことだと勝手に解釈しています。
110
+
111
+ ...とここまで書いてコンストラクタでinit()すればいいのか?とも思ったのですが、
112
+
113
+ c++でもあるインスタンスAのメンバにアクセスしたいときはそのインスタンスA自体を参照すればよくて、
114
+
115
+ 新しい別のインスタンスBを宣言する必要はないですよね。
116
+
117
+
118
+
119
+ やっぱり大元のSceneにaddChild()するためにcreate()した時に返ってきたアドレスをなんらかの方法
120
+
121
+ で保持しておくしか方法はなくないですか?