SKSceneのdelegate
SKSceneクラスにiOS8 SDKからdelegateが設定された。本書ではSceneクラスにdelegateを設定してそこへコールバックするコードを書いている。つまり競合するのだ。
もちろんiOS8以降でしか使わないならなんら問題はない。同じ定義が重なっている場合には特にエラーにはならない。でも、iOS7でも動かしたいと思うと問題だ。
「id delegate;」を宣言するだけなら問題はない。型も同じなのでコンパイルできる。だが、iOS7ではSKSceneのインスタンスにはプロバティのdelegateもインスタンス変数の_delegateもないのだから、setDelegate:を呼び出すときに実行時エラーになってしまう。
回避方法としては、自分用に作ったdelegateの名前を変えることが考えられる。
@property (weak,nonatomic) id myDelegate;
if ( [self.myDelegate respondsToSelector:@selector(sceneEscape:)] ){
iddummy = (id )self.myDelegate;
[dummy sceneEscape:self];
}
実機で動作確認を
シミュレータでもほとんどの機能は使えるようなのだが、ごく一部に正常に動かない機能があるようだ。ほとんど正常に動いているだけに、ちょっとおかしいなと思ってもほとんど正常に動いているので自分のコードが悪いのかと思ってしまう。
とりあえず実機で動かしてみよう。そうすれば正常に動いているかもしれないから。
一つは、CoreImageを使った機能。SKEffectNodeクラスは特殊効果としてCoreImageのフィルターを設定できる。だが、シミュレータではほぼすべて正常に動作しない。SKEffectNodeを使った効果を確認する場合にはシミュレータではなく実機確認が必須。
十分確認したわけではないが、Overtakeサンプルを実行するときに座標変換がおかしくなる。anchorPointを移動しているのが原因ではないかと思うが、衝突判定時に渡されてくるSKContactのcontactPointが間違った値で返ってくる。そのためエフェクトなどがおかしな位置に発生する。実機で確認すると正常な位置にエフェクトが出る。
一体何が正常に動作してなにが正常に動作しないのか整理できていないが、であればちょっとでもおかしかったらまず実機で確認すべきだろう。できることなら最初から実機で動作確認することをおすすめしたい。