だいたい47度

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop

CCMenuAdvancedのboundaryRectについて

CCMenuAdvancedのboundaryRectについて、少し混乱したのでメモ。

cocos2d-extensionのCCMenuAdvancedは、CCMenuなのだけど、menuそのものを動かすこともできるという便利なクラス。menuの項目が描写したい領域に収まらないときに使うのが便利です。

ただmenuが完全に自由自在に動かせてしまうとマズイです。例えば、menuを縦方向にのみ動かせるようにしたい場合、横方向へは動かせないようにしなくてはいけません。

そこでmenuの動作を規定するために、boundaryRectというプロパティにCGRectを登録してやります。すると「menu.boundingBoxはboundaryRectを内包する場合にのみ動ける」ようになります。例えて言うならば、menu描画領域が輪投げの輪、boundaryRect領域が輪投げの軸という感じです(わかりづらい?)。

縦にしか移動できないCCMenuAdvancedを作りたいのであれば、boundaryRectの幅をmenu.contentSizeの幅と同じにしてあげればよいわけです。更に、menuが一番下まで移動した時にmenuの一番上が引っかかる部分をboundaryRectの上辺、逆にmenuが一番上まで移動した時にmenuの一番下が引っかかる部分をboundaryRectの下辺としてあげることになります。

boundaryRectがmenu描画領域からハミ出てしまう場合は、boundaryRectの右上が標準となります。例えば、boundaryRectにmenuが完全に内包されてしまう場合は、boundaryRectの右上とmenuの右上が揃う形で固定されます。その場合、スクロールはできません。また、boundaryRectの縦幅はmenu描画領域に収まるものの、横幅が収まらない場合は、menuは右軸に固定され、上下動はできる形になります。

boundaryRectに従う動きは、CCMenuAdvancedのfixPositionメソッドで実装されています。fixPositionは、ccTouchMoveである程度以上の動きが感知されるたびに呼び出され、ハミ出ている場合はmenuの位置を補正します。

よって、CCMenuAdvancedをaddする場合は、positionは適当にしておいて、boundaryRectを設定後にfixPositionを呼び出してあげるのが簡単そうです。

//画面左端で縦方向に動かせるCCMenuAdvanced
//必要なCCMenuItemがitemArrayに格納されているとする
CCMenuAdvanced* menu = [CCMenuAdvanced menuWithArray:itemArray];
[menu alignItemsVerticallyWithPadding:5.0f bottomToTop:NO];
CGSize screenSize = [[CCDirector sharedDirector] winSize];
menu.boundaryRect = CGRectMake(0, 0, menu.contentSize.width, screenSize.height);
[menu fixPosition];//boundaryRectの右上に揃う

関連記事
スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する
 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。