Cocos2d - CCMenu con varios botones llama al selector incorrecto en la primera carga

He aquí un dilema interesante. Tengo dos CCMenus que se cargan en una página, cada uno con dos CCMenuItemImages como botones. Los cuatro botones llaman a la misma función, que decide qué hacer mediante una declaración de conmutación que desactiva el valor de la etiqueta de la persona que llama.

Los cuatro botones son inicio, tutorial, opciones y créditos. Los tengo divididos en dos menús para poder alinearlos horizontal y verticalmente en una cuadrícula falsa. Esta capa es la capa del menú principal, por lo que es lo primero que se carga después de que comienza el juego.

El problema es que cuando el juego se carga por primera vez, al presionar cualquier El botón llamará al botón "opciones". No solo la función, presionando cualquier botón en el menú activa el estado seleccionado del botón de opciones. Si presiono "iniciar", por ejemplo, el estado seleccionado del botón de inicio (un brillo alrededor de la imagen) no funciona; el botón de opciones se ilumina en su lugar.

Una vez que entro en el menú de opciones, y luego salgo de él, el menú principal funciona como se esperaba, con cada botón activando su función requerida.

Debo tener en cuenta que también ejecuté una limpieza, eliminé la aplicación tanto del simulador como de mi iPhone y la reconstruí.

Aquí está mi .h:

#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "Constants.h"
#import "GameManager.h"

@interface MainMenuLayer : CCLayer {
    CCMenu *mainMenuTop;
    CCMenu *mainMenuBottom;
}
@end

Y este es mi .m:

#import "MainMenuLayer.h"

// Private methods
@interface MainMenuLayer()
- (void)displayMainMenu;
@end

@implementation MainMenuLayer

- (void)playScene:(CCMenuItemFont*) itemPassedIn {
    if ([itemPassedIn tag] == 1) {
        CCLOG(@"Tag 1 found, Scene 1");
        [[GameManager sharedGameManager] runSceneWithID:kGameplayScene];
    } else if ([itemPassedIn tag] == 2) {
        CCLOG(@"Tag was: %d", [itemPassedIn tag]);
        CCLOG(@"Placeholder for next chapters");
    } else if ([itemPassedIn tag] == 3) {
        CCLOG(@"Tag 3, Options");
        [[GameManager sharedGameManager] runSceneWithID:kOptionsScene]; 
    } else if ([itemPassedIn tag] == 4) {
        CCLOG(@"Tag 4, Credits");        
        [[GameManager sharedGameManager] runSceneWithID:kCreditsScene];
    }
}

- (void)displayMainMenu {
    CGSize winSize = [CCDirector sharedDirector].winSize;

    // Main Menu Top Layer Buttons
    CCMenuItemImage *playGameButton = [CCMenuItemImage itemFromNormalImage:@"button-start-up.png" selectedImage:@"button-start-down.png" disabledImage:nil target:self selector:@selector(playScene:)];
    [playGameButton setTag:1];

    CCMenuItemImage *tutorialButton = [CCMenuItemImage itemFromNormalImage:@"button-tutorial-up.png" selectedImage:@"button-tutorial-down.png" disabledImage:nil target:self selector:@selector(playScene:)];
    [tutorialButton setTag:2];

    // Main Menu Bottom Layer Buttons
    CCMenuItemImage *optionsButton = [CCMenuItemImage itemFromNormalImage:@"button-options-up.png" selectedImage:@"button-options-down.png" disabledImage:nil target:self selector:@selector(playScene:)];
    [optionsButton setTag:3];

    CCMenuItemImage *creditsButton = [CCMenuItemImage itemFromNormalImage:@"button-credits-up.png" selectedImage:@"button-credits-down.png" disabledImage:nil target:self selector:@selector(playScene:)];
    [creditsButton setTag:4];

    mainMenuTop = [CCMenu menuWithItems:playGameButton,tutorialButton,nil];
    mainMenuBottom = [CCMenu menuWithItems:optionsButton,creditsButton,nil];

    [mainMenuTop alignItemsHorizontallyWithPadding: 10.0f];
    [mainMenuTop setPosition: ccp(winSize.width/2, -500)];
    [mainMenuBottom alignItemsHorizontallyWithPadding:10.0f];
    [mainMenuBottom setPosition:ccp(winSize.width/2, -600)];

    id moveActionTop = [CCMoveTo actionWithDuration:0.5f position:ccp(winSize.width/2, 150)];
    id moveEffectTop = [CCEaseIn actionWithAction:moveActionTop rate:1.0f];
    [mainMenuTop runAction:moveEffectTop];
    [self addChild:mainMenuTop z:2 tag:kMainMenuTagValue];

    id moveActionBottom = [CCMoveTo actionWithDuration:0.5f position:ccp(winSize.width/2, 75)];
    id moveEffectBottom = [CCEaseIn actionWithAction:moveActionBottom rate:1.0f];
    [mainMenuBottom runAction:moveEffectBottom];
    [self addChild:mainMenuBottom z:3 tag:kMainMenuBottomTagValue];
}

-(id)init {
    self = [super init];
    if (self != nil) {        
        [self displayMainMenu];
    }
    return self;
}

@end

preguntado el 01 de febrero de 12 a las 14:02

muy sospechoso ... ¿podría ser que su argumento "CCMenuItemFont * para playScene esté arruinando las cosas (no debería ser CCMenuItemImage * de todos modos)? O puede intentar esto: - (void) playScene: (id) sender {if ( [etiqueta de remitente] == 1 ..} -

Semánticamente eso tiene más sentido y lo he cambiado. Lamentablemente, no resuelve el problema = / -

Agregar todas las CCMenuItemImages a un solo CCMenu parece solucionar el problema, pero eso no ayuda al problema de alineación de la "cuadrícula" que estaba tratando de resolver en primer lugar. ¿Hay alguna forma de alinear los elementos de CCMenu tanto horizontal como verticalmente? -

ahh ... o simplemente puede tener una función diferente para cada botón :) no se requieren etiquetas .. bueno para que funcione primero, ¡luego busque formas de ordenar / optimizar su código más tarde! -

no vi tu último comentario. Creo que puede colocar y ejecutar acciones en botones de menú individuales. Configure menu.position = ccp (0,0), luego coloque manualmente los botones de menú fuera de la pantalla según corresponda y ejecute las acciones de los botones. -

1 Respuestas

Terminé colocando las cosas manualmente. Intenté utilizar el método vinculado por LearnCocos2D, pero no pude determinar cómo hacerlo funcionar correctamente; los elementos no terminaron en una cuadrícula adecuada.

Respondido 03 Feb 12, 06:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.