Cocos2D 2.0 - usando CCSpriteBatchNode, CCMenuItem y CCmenu

Estoy tratando de reducir la cantidad de llamadas de OpenGL y el uso de memoria usando CCSpriteBatchNode.

Necesito crear un CCMenu usando este código:

CCSpriteBatchNode *batchNode = [CCSpriteBatchNode batchNodeWithFile:@"atlasGeral.png"];

CCSprite *inputNormal = [CCSprite spriteWithSpriteFrameName:@"normalInput.png"];
CCSprite *inputPressed = [CCSprite spriteWithSpriteFrameName:@"PressedInput.png"];
[batchNode addChild:inputNormal];
[batchNode addChild:inputPressed];


CCMenuItem *input = 
    [CCMenuItemSprite itemWithNormalSprite:inputNormal
                           selectedSprite:inputPressed
                                   target:self 
                                 selector:@selector(InputMenu:)];
CCMenu *mInputMenu = [CCMenu menuWithItems:input, nil];

Esto se está estrellando catastóficamente con el mensaje. Error de aserción en -[CCMenuItemSprite addChild:z:tag:]

¿alguna pista? Por cierto, ¿alguien puede crear o señalar algún tutorial que explique decentemente cómo usar este CCSpriteBatchNode junto con estos otros elementos como CCMenus, CCMenuItems y otras bellezas? Cocos2D no tiene documentación sobre casi todas las funciones más importantes.

Gracias.

preguntado el 12 de junio de 12 a las 20:06

1 Respuestas

Bueno, los sprites inputNormal e inputPress son elementos secundarios del nodo por lotes. Por lo tanto, cuando intenta agregarlos como hijo nuevamente a otro descendiente de nodo, Coco se queja porque ya tiene un padre. No se puede hacer, me temo. imnsho, los nodos por lotes están muy sobrevalorados. La ganancia de mejora solo se puede cosechar en muy pocos y limitados casos de uso.

Nuevamente, directamente desde el código CCMenuItemSprite (versión 1.0.1)

-(void) setNormalImage:(CCNode <CCRGBAProtocol>*)image
{
    if( image != normalImage_ ) {
        image.anchorPoint = ccp(0,0);
        image.visible = YES;

        [self removeChild:normalImage_ cleanup:YES];
        [self addChild:image];

        normalImage_ = image;
    }
}

el elemento del menú intenta agregar el sprite (ya hijo) a sí mismo. Sin frijoles.

Respondido el 12 de junio de 12 a las 21:06

Gracias. Por lo que veo estos CCSpriteBatchNode están lejos de ser algo realmente útil. Tienen un uso muy limitado y muchos problemas. ¡La única solución es, quizás, crear mi propia clase similar a CCMenu! - Pato

CCSpriteBatchNode puede ser un gran ahorro de rendimiento si las imágenes son bastante grandes o si en su mayoría están escaladas y rotadas. Dado que los nodos por lotes de sprites no tienen otra restricción que solo permitir sprites como elementos secundarios, intente incorporarlos en su diseño desde el principio. - AprendeCocos2D

@LearnCocos2D: estuvo de acuerdo con el caso de uso que menciona, asumiendo que no está tratando de intercalar objetos gráficos de múltiples texturas en diferentes zOrders en una capa. Es posible que me haya perdido cómo agregar múltiples nodos por lotes a una capa, pero hacer que todos los sprites secundarios estén referenciados a un eje z único (el de la capa). - yvesleborg

¡@LearnCocos2D estuvo de acuerdo! En un proyecto en el que estaba trabajando, tenía un sprite de siete capas. sin que se usara el nodo de lote para manejar todas las imágenes que componían esas capas, el rendimiento fue atroz. Dicho esto, los estaba usando en mi proyecto actual, pero el hecho de que los nodos en el nodo por lotes no sean en realidad hijos de los padres visuales de los que son hijos visuales, significa que las acciones en el padre visual, como el escalado, la posición, etc. no se aplican entonces a los niños visuales. Esto hace que trabajar con un nodo por lotes sea mucho más complicado de lo que debería ser, lo cual es una pena. - PKCLsoft

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