2010-07-27 18 views
9

¡Debo extrañar algo!Cocos2d: ¿sprite rectangular de color sólido?

Quiero crear un CCSprite rectangular sólido con un color de fondo inicializado en un valor RGB particular. He buscado en todos los documentos y no puedo encontrar nada.

¿Hay alguna forma de inicializar el fondo de CCSprite en un color específico? No quiero tener que incluir un PNG de color sólido para cada color que necesite.

¡Ayuda!

Respuesta

9

CCSprite tiene una propiedad de tipo colorccColor3B:

- (ccColor3B) color [read, assign] 
RGB colors: conforms to CCRGBAProtocol protocol  

Definition at line 145 of file CCSprite.h. 

Fuente: CCSprite referencia.

Usted puede construir fácilmente una estructura ccColor3B usando ccc3():

ccc3(const GLubyte r, const GLubyte g, const GLubyte b) 

Referencia: ccColor3B referencia.

+6

Justin, gracias, eso era lo que estaba haciendo ... ¡el truco adicional, por supuesto, es configurar el textureRect correctamente! – poundev23

+0

Gracias @ poundev23, eso es lo que estaba buscando – aiham

+0

Cuidado, esto no parece funcionar en subprocesos asincrónicos. – GoldenJoe

5

Encontré la respuesta en cocos2d cookbook. El siguiente código se deriva del capítulo 1 de ese libro, que es gratuito para la vista previa.

-(CCSprite *) rectangleSpriteWithSize:(CGSize)cgsize color:(ccColor3B) c 
{ 
    CCSprite *sg = [CCSprite spriteWithFile:@"blank.png"]; 
    [sg setTextureRect:CGRectMake(0, 0, cgsize.width, cgsize.height)]; 
    sg.color = c; 
    return sg; 
} 

Sí, esto todavía requiere un archivo de imagen externo. Pero con este 1x1 pequeño 'blank.png', puedes generar sprites rectangulares de color sólido con un tamaño y color arbitrarios.

+2

para aquellos imagen externa –

21

¡Hazlo con el código! si no quiere meterse con los archivos de imagen, aquí tiene su método:

- (CCSprite*)blankSpriteWithSize:(CGSize)size 
{ 
    CCSprite *sprite = [CCSprite node]; 
    GLubyte *buffer = malloc(sizeof(GLubyte)*4); 
    for (int i=0;i<4;i++) {buffer[i]=255;} 
    CCTexture2D *tex = [[CCTexture2D alloc] initWithData:buffer pixelFormat:kCCTexture2DPixelFormat_RGB5A1 pixelsWide:1 pixelsHigh:1 contentSize:size]; 
    [sprite setTexture:tex]; 
    [sprite setTextureRect:CGRectMake(0, 0, size.width, size.height)]; 
    free(buffer); 
    return sprite; 
} 

entonces se puede establecer el color, el tamaño y la opacidad, según sea necesario. ;)

+1

Para aquellos de uso que trabajan con la parte contraria mutada (que es cocos2d-x): https://gist.github.com/Mazyod/208e5fb2d7a56290a261 – Mazyod

3

Nunca conseguí que CCSprite funcionara así. Solo uso CCLayerColor.

CCLayerColor* layercolorHalftransparentred = [CCLayerColor layerWithColor:ccc4(255, 0, 0, 128)]; 
0

Para cualquier persona que tropiece con esta pregunta (como yo); el código de Matjan ya no parece funcionar en los cocos 2d 3.x. Vea a continuación una versión alterada que funciona para mí:

+ (CCSprite*)blankSpriteWithSize:(CGSize)size 
{ 
    GLubyte *buffer = malloc(sizeof(GLubyte)*4); 
    for (int i=0;i<4;i++) {buffer[i]=255;} 
    CCTexture *tex = [[CCTexture alloc] initWithData:buffer pixelFormat:CCTexturePixelFormat_RGBA8888 pixelsWide:1 pixelsHigh:1 contentSizeInPixels:size contentScale:1]; 
    CCSprite *sprite = [CCSprite spriteWithTexture:tex rect:CGRectMake(0,0,size.width,size.height)]; 
    free(buffer); 
    return sprite; 
} 
Cuestiones relacionadas