回答編集履歴

1

cocos2d-x の Node を使う場合に限定するべきだと感じたので、回答を完全に書き直しました。

2018/11/12 03:00

投稿

daisuke7
daisuke7

スコア1563

test CHANGED
@@ -1,59 +1,129 @@
1
- cocos2d::Node を継承してCREATE_FUNC定義しただとしても、
1
+ cocos2d::Node を継承しているクラスのオブジェクトを作成する場合は、参照カウントを意識する必要があります。CREATE_FUNC()マロの中身を読めばわかりますが、CREATE_FUNC()が作成する Xxx::create() メソッドは「インタンスをnewして」「init()を呼んで」「正常ならautorelease()を呼ぶ」まで実行します。
2
2
 
3
+ このあたりを理解して保持するようにしないとリークします。
4
+
5
+
6
+
7
+ で、どうやって保持するかですが、CC_SYNTHESIZE_RETAIN()マクロでプロパティ作ってsetXxx()やgetXxx()で設定、取得する方法、あるいは子ノードになっているのであればgetChildByTag()で取得する方法などが考えられます。
8
+
9
+
10
+
3
- あるいは通常のクラスだとしても、結局C++クラスnewでインスタンス生)なの
11
+ CC_SYNTHESIZE_RETAIN などcocos2d-x独自シンセサイザプロパティ)作用マクロす。
12
+
13
+ [cocos2d-xマクロまとめ](https://qiita.com/tani-shi/items/d8abd0305d4db60aefa5) などに説明があります。
14
+
15
+
4
16
 
5
17
 
6
18
 
7
19
  ```C++
8
20
 
9
- #include <iostream>
21
+ class Banana : public cocos2d::Layer
10
22
 
11
- using namespace std;
12
-
13
-
14
-
15
- class Banana {
23
+ {
16
24
 
17
25
  public:
18
26
 
19
- Banana() : seed(12345) {}
27
+ virtual bool init();
20
28
 
21
- int seed;
29
+ virtual ~Banana() {}
30
+
31
+ CREATE_FUNC(Banana);
32
+
33
+
34
+
35
+ // 参照カウント付きシンセサイザ(ほんとは最後に release必要だからね)
36
+
37
+ CC_SYNTHESIZE_RETAIN(cocos2d::Sprite*, _seed, Seed);
22
38
 
23
39
  };
24
40
 
25
41
 
26
42
 
27
- class Apple {
43
+ class GameScene : public cocos2d::Layer
44
+
45
+ {
28
46
 
29
47
  public:
30
48
 
31
- void makeBanana() {
49
+ static cocos2d::Scene* createScene();
32
50
 
33
- auto banana = new Banana();
51
+ virtual bool init();
34
52
 
35
- cout << banana->seed << endl; // ポインタさえあれば参照出来る
53
+ virtual ~GameScene() {}
36
54
 
37
- delete banana;
55
+ CREATE_FUNC(GameScene);
38
56
 
57
+
58
+
39
- }
59
+ CC_SYNTHESIZE_RETAIN(Banana*, _bananaLayer, BananaLayer);
40
60
 
41
61
  };
42
62
 
43
63
 
44
64
 
45
- int main(void){
46
65
 
47
- Apple a;
48
66
 
49
- a.makeBanana();
67
+ bool GameScene::init()
50
68
 
69
+ {
70
+
71
+ if (!Layer::init()) {
72
+
73
+ return false;
74
+
75
+ }
76
+
77
+
78
+
79
+ auto banana = Banana::create();
80
+
81
+ setBananaLayer(banana); // CC_SYNTHESIZE_RETAIN()で作成したプロパティに set
82
+
83
+
84
+
85
+ auto pos = getBananaLayer()->getSeed()->getPosition(); // bananaのseed取得
86
+
87
+
88
+
51
- return 0;
89
+ return true;
52
90
 
53
91
  }
54
92
 
93
+
94
+
95
+ bool Banana::init()
96
+
55
- ```
97
+ {
98
+
99
+ if (!Layer::init()) {
100
+
101
+ return false;
102
+
103
+ }
104
+
105
+
106
+
107
+ auto seed = Sprite::create();
108
+
109
+ setSeed(seed); // プロパティにset
110
+
111
+
112
+
113
+ // あるいは子ノードであれば getChildByTag<>() で取得できる
114
+
115
+ addChild(seed, 1, 12345);
116
+
117
+ auto childSeed = getChildByTag<Sprite*>(12345);
56
118
 
57
119
 
58
120
 
59
- とでもすれば良いと思いますが、なにか他に問題があるのでしょうか?
121
+ return true;
122
+
123
+ }
124
+
125
+
126
+
127
+
128
+
129
+ ```