Actualmente estoy desarrollando un juego de cartas para iphone usando cocos2d. Actualmente necesito una vista de pestaña en la que cada pestaña represente a un jugador y su juego de cartas. Actualmente tengo una vista única que representa a un solo jugador. Parece que cocos2d no está realmente construido, tiene múltiples vistas, para hacer esto y requeriría una gran cantidad de piratería con el código. ¿Cuál sería la forma más eficiente de lograr esto?


¿Puedes encontrar algo obviamente mal aquí? Creé una nueva clase llamada PlayerController (del delegado de aplicaciones), el delegado de la aplicación llama al método de escena, que posteriormente llena una matriz con dos objetos de "manos" y llama a initWithPlayerHands (sé que no debería estar aquí, pero solo quería que las cosas funcionaran primero). También he codificado moveToPlayerHand para apuntar al elemento 0

-(CCScene *) scene
{
    // 'scene' is an autorelease object.
    CCScene *scene = [CCScene node];
    // 'layer' is an autorelease object.
    PlayerController *layer = [PlayerController node];

    // add layer as a child to scene
    [scene addChild: layer];

    HelloWorldLayer *layer1 = [[HelloWorldLayer alloc] init];
    HelloWorldLayer *layer2 = [[HelloWorldLayer alloc] init];

    allLayers = [[NSMutableArray alloc] initWithCapacity:6];
    [allLayers addObject:layer1];
    [allLayers addObject:layer2];   
    [self initWithPlayerHands:allLayers];

    // return the scene
    return scene;
}

-(id)initWithPlayerHands:(NSMutableArray *)layers
{
    NSMutableArray *allPlayers;

    if ( (self = [super init]) )    
    {
        currentScreen = 1;
        [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:-1 swallowsTouches:NO];
        [self setIsTouchEnabled:YES];
        scrollWidth = [[CCDirector sharedDirector] winSize].width;
        scrollHeight = [[CCDirector sharedDirector] winSize].height;
        startWidth = scrollWidth;
        startHeight = scrollHeight;

        allPlayers = [[NSMutableArray array] retain];
        int count = [layers count];
        int i = 0;

        for (CCLayer *l in layers)
        {
            l.anchorPoint = ccp(0,0);
            l.position = ccp((i*scrollWidth),0);
            [self addChild:l ];
            i=i+1;
            count-=1;
        }
        totalScreens = i;       
    }       
    return self;
}

-(void) moveToPlayerHand:(int)hand //this represents the layer you want to move to
{
    float dest = /*((currentScreen-1)*scrollHeight);*/ 0;
    id changeHand = [CCEaseBounce actionWithAction:[CCMoveTo actionWithDuration:0.2 position:ccp(0,dest)]];
    [self runAction:changeHand];
    currentScreen = hand;   
}
-1
godzilla 1 abr. 2012 a las 20:17

1 respuesta

La mejor respuesta

Hice algo similar a esto usando cocos2d (con diferentes vistas). Resolví el problema usando un CCLayer de desplazamiento que contenía 2 (o más) capas. Esta capa de desplazamiento era parte de una escena que tenía otra capa de control colocada encima (z superior). Puede lograr lo mismo si tiene las manos de los diferentes jugadores como capas en una capa de desplazamiento y luego una capa separada que es más alta que el desplazamiento con 2 sprites, o 2 botones que le dicen a la capa de desplazamiento a cuál de sus capas internas debe desplazarse. . La capa de desplazamiento y la capa de control pueden comunicarse utilizando el CCScene compartido en el que se encuentran ambas.

Lo siento, supongo que mi respuesta no fue del todo clara. Estos métodos deben ir en una subclase de CCLayer, por lo que myScrollerLayer: CCLayer debe ser la interfaz. La escena debe crear la matriz, así como crear el scrollerLayer pasándole la matriz creada. Entonces, debido a que tiene una referencia tanto para la capa de control como para scrollerLayer en la escena, puede pasar mensajes a cada capa.

Aquí está el código para la capa de desplazamiento, primero debe crear sus 2 capas que representan la mano del jugador, luego puede iniciar una nueva capa de desplazamiento pasándole una matriz de capas:

-(id) initWithPlayerHands:(NSMutableArray *)layers
{

    if ( (self = [super init]) )
    {

        // Make sure the layer accepts touches
        [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:-1 swallowsTouches:NO];
        [self setIsTouchEnabled:YES];

        // Set up the starting variables
        currentScreen = 1;
        scrollWidth = [[CCDirector sharedDirector] winSize].width;
        scrollHeight = [[CCDirector sharedDirector] winSize].height;
        startWidth = scrollWidth;
        startHeight = scrollHeight;

        allPlayers = [[NSMutableArray array] retain]; //iVar that holds the layers that represent the players hands.
        // Loop through the array and add the screens
        int count = [layers count];
        int i = 0;
        for (CCLayer *l in layers)
        {

            l.anchorPoint = ccp(0,0);
            l.position = ccp((i*scrollWidth),0);
            //Add them with inverse levels so that the touches can pass through all of the board layers (This is something I did special for my project, I don't think you have to)
            [self addChild:l z:count];
            [allLayers addObject:l];
            i=i+1;
            count-=1;

        }

        // Setup a count of the available screens
        totalScreens = i;

    }
    return self;

}

Y así es como pasar a la mano de un jugador:

-(void) moveToPlayerHand:(int)hand //this represents the layer you want to move to
{

    id changeHand = [CCEaseBounce actionWithAction:[CCMoveTo actionWithDuration:0.3 position:ccp(-((page-1)*scrollWidth),0)]];
    [self runAction:changeHand];
    currentScreen = hand;

}

Espero que esto te lleve por el camino correcto, si quieres ver cómo funcionó esto para mí, puedes consultar el enlace en mi perfil. Hay un video en el medio de la página que muestra el desplazamiento.

0
tams 2 abr. 2012 a las 10:37
Gracias por la respuesta Tams, eso bien podría ser lo que estoy buscando, si puedes publicar algún código te lo agradecería mucho, muchas gracias :)
 – 
godzilla
1 abr. 2012 a las 21:03
Gracias por la respuesta Tams, lo intenté pero parece que estoy haciendo algo mal aunque no puedo distinguir qué es. Lo codifiqué para que siempre elija la primera "vista secundaria", es decir, la primera mano de mi juego. aquí hay algo de mi código, si puede detectar algún error obvio, realmente le agradecería que me pudiera aconsejar:
 – 
godzilla
2 abr. 2012 a las 05:23
Gracias Tams, me tomó toda la noche pero tengo el marco de todo casi funcionando, solo tengo que manejar los toques para que cada capa no entre en conflicto con las demás :)
 – 
godzilla
2 abr. 2012 a las 19:14
Hay un problema con pasar el toque a la escena correcta, ¿enfrentaste el mismo problema?
 – 
godzilla
3 abr. 2012 a las 05:38
Solo debe tener 1 escena, múltiples capas (que representan las manos de los jugadores) almacenadas en una matriz en la escena. Pasas esta matriz a scrollingLayer (subclasificada) y también mantienes una referencia a esto en la escena. Si desea tener una capa de controles, puede agregarla a la escena. Entonces, en su única escena, debe llamar a [self addChild:], tanto para scrollingLayer como para la capa de control. Cada una de las capas de la mano del jugador puede declararse como self.isTouchEnabled = YES. Y el scrollLayer no debe tragarse el tacto. Si desea implementar UIGestures, es mejor si están en la escena.
 – 
tams
3 abr. 2012 a las 06:30