2

New game と Credits の 2 つの項目のメニューがあります。これらは次のように垂直に配置されます。

New Game
Credits

新しいゲームをクリックすると、クレジットが下に移動し、次のように 2 つの新しいメニュー項目が開きます。

New Game
  Player vs Player
  Player vs AI
Credits

それ、どうやったら出来るの?私のコードメニューでは、それ自体を上書きするだけなので、それらのアイテムが互いに重なっています。

- (id) init
{
    if ([super init])
    {
        CCLayerColor *bg = [CCLayerColor layerWithColor:ccc4(0, 0, 0, 255)];
        [self addChild:bg z:-1];


        CCMenuItemFont  *menu1 = [CCMenuItemFont itemFromString:@"New Game" target:self selector:@selector(callSecondMenu)];
        [menu1 setColor:ccc3(255, 255, 255)];

        CCMenuItemFont  *menu2 = [CCMenuItemFont itemFromString:@"Credits"];
        [menu2 setColor:ccc3(255, 255, 255)];

        CCMenu *menu = [CCMenu menuWithItems:menu1, menu2, nil];
        [menu alignItemsVerticallyWithPadding:10];
        [self addChild:menu z:10];



    }
    return self;
}

- (void) callSecondMenu
{
    CCMenuItemFont *menu1 = [CCMenuItemFont itemFromString:@"Player vs Player" target:self selector:@selector(callGame)];
    CCMenuItemFont *menu2 = [CCMenuItemFont itemFromString:@"Player vs AI" target:self selector:@selector(callGame)];
    CCMenu *menu = [CCMenu menuWithItems:menu1, menu2, nil];
    [menu alignItemsVerticallyWithPadding:5];
    [self addChild:menu];
}
4

1 に答える 1

3

menuItems は、ゲーム内の単なるキャラクターと考えてください。

ゲームでメニューを移動する方法は、各メニュー項目を独自の個別の CCMenu に作成し、各 CCMenu を位置 0,0 に設定することです。

次に、位置プロパティを使用して CCMenuItemSprite/CCMenuItemFont メニュー項目 (CCMenu ではない) を手動で配置し、必要に応じて CCMoveTo アクションを使用してメニュー項目を移動します。もちろん、これは、使用している CCMenuItemFont など、どの CCMenuItem サブクラスでも機能します。

このアプローチの欠点は、メニュー項目を自動的に整列させる機能が失われ、それらが個別のメニューとして機能することですが、それはメニュー項目を任意の方法で移動して興味深い効果を作成できるという利点に比べてわずかなコストです。

CCFadeIn、CCSkewTo、CCScaleBy などの他のアクションを使用して、個々のメニュー項目にクールな効果を加えることもできます。

1) menuItems を所有するノードが作成されるときに、すべてのメニュー項目を作成します。次に、各メニュー項目が必要になったら、その場所に移動またはフェードしてアニメーション化します。

2)タグの使用を避けます。これは私の好みです。代わりに、2 つの NSMutableDictionary をインスタンス変数として作成することを好みます。1 つは menuButtons と呼ばれ、もう 1 つは menuButtonActions と呼ばれます。次に、ヘルパー関数を使用して menuItem とアクションを作成し、可変辞書に保存します。次に、buttonNamed:runActionNamed: や buttonNamed:setPosition: などの一般的なメソッドが作成されます。次に、これらのメソッドは 2 つの変更可能な辞書を使用して、必要な menuItem とアクション (必要な場合) を取得し、目的の効果を適用します。

これは手間がかかるように思えるかもしれませんが、ゲームに表示したい共通のメニュー ボタンがあるいくつかの異なる状況がある場合、コードをより読みやすく、再利用しやすくすることができます。次のようなコード:

-(void) showNewGameMenuExpanded:(BOOL)isExpanded {

    if(isExpanded){
        [menuNode buttonNamed:@"credits" runActionNamed:@"creditsSlideDown"];
        [menuNode buttonNamed:@"playerVsPlayer" runActionNamed:@"playerVsPlayerShow"];
        [menuNode buttonNamed:@"playerVsAi" runActionNamed:@"playerVsAiShow"];
    }else{
        [menuNode buttonNamed:@"credits" runActionNamed:@"creditsSlideUp"];
        [menuNode buttonNamed:@"playerVsPlayer" runActionNamed:@"playerVsPlayerHide"];
        [menuNode buttonNamed:@"playerVsAi" runActionNamed:@"playerVsAiHide"];
    }

}

メニュー ノードの init でボタンとアクションを作成し、使用するために辞書に保存するこの手法は、一時停止メニューや、画面の横からスライドして別の武器を選択できるようにするメニューなどに最適です。


編集:

タグを使用してメニュー項目にアクセスしてメニュー項目を移動する方法を示す、Mazyod によって追加されたコードを次に示します。

まず、tagプロパティをCCMenuItemsに設定します。

    CCMenuItemFont  *menu1 = [CCMenuItemFont itemFromString:@"New Game" target:self selector:@selector(callSecondMenu)];
    [menu1 setColor:ccc3(255, 255, 255)];
    [menu1 setTag:1];

    CCMenuItemFont  *menu2 = [CCMenuItemFont itemFromString:@"Credits"];
    [menu2 setColor:ccc3(255, 255, 255)];
    [menu2 setTag:2];

    CCMenu *menu = [CCMenu menuWithItems:menu1, menu2, nil];
    [menu alignItemsVerticallyWithPadding:10];
    // add tag for the menu, or use instance variables:
    [self addChild:menu z:10 tag:kMenuTag];

次に、他の方法で:

CCMenuItem* credits = [[self getChildByTag:kMenuTag] getChildByTag:2];
// apply the action ... It has been ages since I touched cocos2d:
[credits runAction:[CCMoveBy actionWithDuration:0.5f position:ccp(0, 40)]];

CCMenuItemFont *menu1 = [CCMenuItemFont itemFromString:@"Player vs Player" target:self selector:@selector(callGame)];
CCMenuItemFont *menu2 = [CCMenuItemFont itemFromString:@"Player vs AI" target:self selector:@selector(callGame)];
CCMenu *menu = [CCMenu menuWithItems:menu1, menu2, nil];
[menu alignItemsVerticallyWithPadding:5];
[self addChild:menu];
于 2012-08-05T15:06:37.213 に答える