cocos2d iphone - Objeto de juego con composición y CCSpriteBatchNode continuación
cocos2d-iphone code-organization (1)
¿Alguien consideraría el siguiente escenario y me daría una sugerencia: estoy implementando un juego básico de cocos2d con un GameplayLayer que tiene un CCSpriteBatchNode. Tengo un GameObject: CCNode que tiene 3 CCSprites así:
CCSprite *bodySprite;
CCSprite *hairSprite;
CCSprite *eyesSprite;
Al inicializar GameObject
, estoy agregando los sprites a GameObject
como a sus hijos les gusta así:
[self addChild:bodySprite];
[self addChild:hairSprite];
[self addChild:eyesSprite];
De esta forma puedo cambiar la posición, la rotación, etc. del nodo ( GameObject
) y todos los sprites se verán afectados por el cambio PERO hay un problema de rendimiento importante cuando agrego más de un GameObject
a la escena ya que "cada sprite dibuja sí mismo, lo que significa una llamada de sorteo adicional por sprite " .
Para solucionar el problema de rendimiento, después de leer esta publicación , decidí agregar los sprites de CCSpriteBatchNode
al CCSpriteBatchNode
de CCSpriteBatchNode
al inicializar así:
[[GameplayLayer sharedGameplayLayer].sceneSpriteBatchNode addChild:bodySprite];
[[GameplayLayer sharedGameplayLayer].sceneSpriteBatchNode addChild:hairSprite];
[[GameplayLayer sharedGameplayLayer].sceneSpriteBatchNode addChild:eyesSprite];
Solo ahora, tengo que establecer la posición de los sprites de GameObject
uno por uno, en lugar de
self.position = ...
Tengo que usar
bodySprite.position = ...
hairSprite.position = ...
eyesSprite.postion =...
Lo cual es un cambio tedioso y pierdo uno de los mayores beneficios de haber diseñado mi GameObject
como una composición de sprites.
La pregunta: ¿Hay alguna manera de usar la posición del nodo para afectar las posiciones de los sprites de composición? ¿Puedo agregarlos como elementos GameObject
a AMBOS GameObject
y sceneSpriteBatchNode
? Si no es el enfoque correcto, ¿está configurando las posiciones de los sprites uno por uno?
Primero, "rendimiento principal" es relativo. Si ese es tu único sprite, no verás ningún efecto del sprite en ellos. Es una historia diferente si tiene docenas de ellos en la pantalla al mismo tiempo.
No puede agregar un nodo a dos padres al mismo tiempo.
Lo que podrías hacer es crear un sprite "contenedor". Cree un CCSprite con textura (igual que la textura del nodo de lote de sprites) y un CGRectEmpty como textura rect. Eso hace que el sprite no dibuje nada y puede usarlo como si fuera un CCNode agregado al CCSpriteBatchNode.
Luego puedes agregar tus sprites a ese sprite invisible y usar el sprite del contenedor para afectar la posición, rotación, etc. de sus sprites hijos como solías hacerlo.