CCSceneとCCLayerはCCNodeと同様ビジュアル表現を持たない抽象概念
シーングラフの出発点はCCScene
CCLayerはノードのグループ化、入力の処理など
CCScene
[[CCDirector sharedDirector] runWithScene:[HelloWorld scene]]; //最初のシーン登録
[[CCDirector sharedDirector] replaceScene:[HelloWorld scene]]; //置き換え
新しいシーンを読み込むときは古いシーンが破棄される前なので一時的にメモリが増大する
シーンの作成と破棄でログを吐くといい。切替時にdeallocのログメッセージが送信されていなかったらシーン全体がメモリリークしていることになる。
ノードのメモリ管理はcocos2dに任せないと危険。
シーンのプッシュとポップ
pushSceneとpopScene。古いシーンを破棄せずに新しいシーンを実行
複数の場所で使われる共通のシーン、ボリュームなどの設定画面の呼び出しなどに使う。
素早く変更できる反面メモリを食う。
スタックに積むので気をつけないと積み過ぎになったり取り過ぎになったりしてしまう。
[[CCDirector sharedDirector] pushScene:[Stettings scene]]; //プッシュ
[[CCDirector sharedDirector] popScene]; //ポップ
CCTransitionScene
見た目は良いが切り替えに時間が掛かる。1秒以内か使わないのが妥当。
//3秒で赤にフェード
CCTransitionFade *tran = [CCTransitionFate transitionWithDuration:3 scene:[HelloWorld scene] withColor:ccRED];
[[CCDirector sharedDirector] replaceScene:tran];
replaceSceneやpushSceneで使えるがpopSceneでは別のテクニックが必要
Transitionの種類
- CCTransitionFade
- CCTransitionFlipAngular
- CCTransitionShrinkGrow
- CCTransitionMoveInB
- CCTransitionMoveInT
- CCTransitionMoveInL
- CCTransitionMoveInR
- CCTransitionFadeTR
- CCTransitionFadeUp
- CCTransitionFlipX
- CCTransitionFlipY
- CCTransitionPageTurn
- CCTransitionCrossFade
CCLayer
シーンによっては複数のCCLayerが必要になることがある。その場合はシーンの作成時にレイヤを追加する必要がある。
たとえば静的なフレームの下にスクロールする背景がある場合など。背景レイヤを動かすとそのレイヤにある要素は追従するので簡単に移動できる。またレイヤのZオーダーに応じて同じレイヤのオブジェクトが前面、背面に移動可能
レイヤはグループ化の概念。まとめて移動、回転、拡縮。
いくつ作ってもいいが、タッチ入力や加速度センサーを受け取るレイヤを作り過ぎないようにする。必要に応じて転送するなど
タッチイベントの受け取り
タッチの開始、移動、終了、中止が報告されるが、中止はほとんど無いので無視するか終了に転送する。
タッチイベントはCocoaTouchAPIによって受け取られるため、OpenGL座標に変換する必要がある
self.isTouchEnabled = YES;
-(CGPoint) locationFromTouch:(UITouch *t)touch{
CGPoint touchLocation = [touch locationInView: [touch view]];
return [[CCDirector sharedDirector] convertToGL:touchLocation];
}
※マルチタッチに対応するには[glView setMultipleTouchEnabled:YES]する必要がある
・ターゲットタッチハンドラは一連のタッチを別々のイベントに分割する。
特定のタッチをイベントキューから削除することで他のレイヤに転送しないようにできる。
ターゲットハンドラを有効にするには
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:INT_MIN+1 swallowsTouches:YES];
タッチ入力メソッドはtouchesではなくtouch
加速度センサー
self.isAccelerometerEnabled = YES;
- (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
//3方向の加速度
CCLOG(@"acceleration x:%f / y:%f / z:%f",acceleration.x,acceleration.y,acceleration.z);
}