いぬでもわかる

iOSやCocos2dxが好きでときどきAndroid。できるだけ毎日何かしら書く事を目標に頑張る。

LayerとNodeのanchorPoint

cocos2d-xでカスタムクラスを作るにあたってLayerを継承すべきなのかNodeを継承すべきなのか考えてみました。
継承関係は、Nodeは画面へのすべての描画を司るクラスのルートクラスで、Nodeを継承したクラスのうちの1つがLayerクラスです。

Layerのreferenceには、以下のように書かれています。
LayerはNodeのサブクラスで、ユーザからのタップを取得するためのTouchEventsDelegateプロトコルを実装している。
以下の2つの機能が追加で実装されているのがNodeとの違いです。
iPhoneのTouchの取得ができる
・加速度センサの値の取得ができる
cocos2d-x: Layer Class Reference


これを見ると、カスタムクラス自身でタッチや加速度の取得を行わない限りNodeを継承したクラスを作るのが良さそうですね。
しかし上にあげた違い以外にも、違いがあるようで何も考えずにLayerを継承したカスタムクラスを作ったところ痛い目にあいました。
というのも、LayerとLayerを継承したクラス(あとScene)ではデフォルトで、anchorPointに何を設定してもそれが無視されてしまうのです。
そのため、自分の意図した場所への配置にならずなんでだ!?と焦りました。


この原因は、Nodeで定義されている_ignoreAnchorPointForPositionプロパティにあります。
このプロパティに、trueが設定されていると設定されているanchorPointを無視して常にPoint(0,0)を基準にして配置が行われます。
そして、SceneとLayerはこのプロパティにデフォルトでtrueが設定されているため、それらのクラスを継承してカスタムクラスを作った時に自分の意図した配置が行われないということがおこってしまっていました。
勿論、Layerを継承したクラスでもこのプロパティにfalseを設定してあげればほかのクラスのようにanchorPointの設定反映することができます。
しかし、このクラスの実装を鑑みると1Sceneに1Layerが基本なのかなと思いますので、カスタムクラスを作りたい場合には極力Nodeを継承したクラスを作ろうと思います。