実質、cocos2D 2.0.0 の変更点まとめな気もしますが、僕がKobold2DユーザーなのでKobold2Dの変更点という事にします!!
まあ、どっちでも良いですね。
少し触って気づいた変更点をまとめます。
基本的には、
ビルド→警告orエラー→原因探し→対処法
という感じでの変更点であるので、「ビルドできねえじゃねえか!!」って人にお勧めです。
というか、今までのプロジェクトをとりあえずビルドできる状態に持って行くためのものです。
##kkAppDelegate の取得方法
//2.0.0
KKAppDelegate *appDelegate = (KKAppDelegate*)[CCDirector sharedDirector].delegate;
//1.1.0
KKAppDelegate* appDelegate = [UIApplication sharedApplication].delegate;
##TouchDispatcher の呼び方の変更
//2.0.0
-(void) registerWithTouchDispatcher
{
CCDirector *director = [CCDirector sharedDirector];
[[director touchDispatcher] addTargetedDelegate:self priority:kCCMenuHandlerPriority swallowsTouches:YES];
}
//1.1.0
-(void) registerWithTouchDispatcher
{
[[CCTouchDispatcher sharedDispatcher]addTargetedDelegate:self priority:kCCMenuTouchPriority swallowsTouches:YES];
}
2.0.0のCCMenuクラスに書いてある registerWithtouchDispatcher メソッドです。
kCCMenuTouchPriority → kCCMenuHandlerPriority
と変更になりましたが、実質の値としては -128 で、変更されていません。
ついでに少しだけ、CCTouchDispatcher の デリゲートの種類についても書いておきます。
デリゲートの設定用メソッドは2つあります。
-(void) addStandardDelegate:priority:
これは CocoaTouch と同じだと思えば良いです。
-(void) addTargetedDelegate:priority:swallowsTouches:
これは swallow するかしないかを YES or NO により自分で設定できるようなメソッドになります。
priority と swallow に関しての説明を簡単に・・・
priority は文字通り"優先度"を表す値です。
CCMenu では kCCMenuHandlerPriority = -128 で定義されています。
xcode で 定義にジャンプすれば、enum 型で定義されている上の定数が見つかるはずです。 この値は大きければ大きい程、そのレイヤーに対するタッチイベントを優先的に受け取る事ができるようになります。(検証していないので注意)
CocoaTouch には swallow という考え方があります。
レイヤーが何枚か重なっており、それぞれのレイヤーが個別にタッチに対するメソッドを持っていたとき、自分としては一番上のレイヤーをタッチしたのに、2枚目以降にもタッチが反映されてしまうような状況は頻繁に考えられます。
このような事を防ぐために、どれか1枚のレイヤーがタッチイベントを受け取ったときに、それ以上余分なタッチイベントを他のレイヤーが受け取らないように、タッチイベントを swallow(飲み込む) します。
レイヤーに対し、 Standard なデリゲートを設定した場合、swallow は自動的に YES に設定される事になります。
##popScene , pushScene に関する変更
-(void)pushSceneWithTransition: メソッドが廃止されました。これから僕は生きて行けない気がします。
コメントとしても書いてあるのですが、スタックが増えすぎる事に注意しなさい、という指針みたいです。全く以てもっともな考えだと思います。
-(void)popSceneWithTransition: が実装されるとの噂もあったのですが、見事に破れたみたいですね。
2.0.0 で実装されている
-(void) pushScene
-(void) popScene
メソッドを実行すると、シーンの動きは全く起こらず、ぱっと新しいシーンが表示、非表示されます。
非表示という言葉は、おせじにも良いとは言えないので、このあたりの内部の動きについて、少し解説を入れておきます。
pushScene を実行すると、今動いてるシーンの”上に”、シーンが作成されます。
文字通り、”上”にです。
つまり、今までのシーンは実行されたまま、さらに別のシーンを実行していく事になります。
こんな事をすれば簡単にメモリリークを起こせるでしょう。
そういう観点からも、 pushScene メソッドは多用すべきではないのです。
そのため、今回のような変更が施されたのかもしれませんね。
replace シーンを使え!というおふれだと、受け取っておくとこにします。
pushScene を多用しても良い事はない、というのは間違いないです。が、あくまで、”多用しても”です。
一時的なウィンドウの生成には便利だったんだけどなあ・・・
##CCMenuItem に関するメソッド名の変更
イニシャライザのメソッド名が、ほとんど(すべて?)変更になりました。
2.0.0
initFrom~~
1.1.0
initWith~~
たったこれだけの変更ですが、結構ビビります。
CCMenuItem を多用している場合、プロジェクトをアップデートして、いざビルドしてみると、警告が鬼のようにでます。
でも実際、出ている警告の8割は上の変更に寄る物です。
ここらへんが、一発目のビルドの時に、個人的にエラーやら警告やらがでた部分なんですが、いざ書いてみると全くたいした事ないですね。
でもまあ、Kobold2Dに関する日本語の情報が、圧倒的に少ないので、発信する事に意味があると思って書いておきました。
Kobold2Dユーザーの皆さん、ぜひ情報交換しましょう。
そういえば、前日書いた CCScroller の EXC_BREAKPOINT に関してですが、2.0.0へのアップデートで、問題なく使用できるように完全されていました。
ARCの誤作動が原因だと思っています。
Kobold2Dの制作者がARCを使わない事は良い事だ、的な事を書いていました。
まだ読んで居ませんが・・・
##info.plistの変更点
info.plistファイルの Required device capabilities の中身の opengles-1 を opengles-2 に。
さらに、armv7 を追加してください。
そして、ここからが本題。
前置き長かった・・・
CCLayerColor を FirstScene として設定したときに、シーンが読み込ませません!
CCLayer の時はOKでしたので、何かのバグかと思います。
現在、原因を探しているので、動き次第、また書こうと思っています。
毎度ですが、対処法を知っている方がいらっしゃいましたら、コメントをいただければ幸いです。
追記。
作者に連絡を入れたところ、どうやらこの問題については既に情報がいっていた様で、すぐに改善されるみたいです。
7/1(現在 6/30 PM 10:00)にはなおっているでしょう。