2010-07-27 9 views
9

Ich muss etwas verpassen!Cocos2d: Einfarbige rechteckige Sprite?

Ich möchte eine solide rechteckige CCSprite mit einer Hintergrundfarbe auf einen bestimmten RGB-Wert initialisiert werden. Ich habe die ganzen Unterlagen durchgesehen und finde nichts.

Gibt es eine Möglichkeit, den Hintergrund von CCSprite auf eine bestimmte Farbe zu initialisieren? Ich möchte nicht eine feste Farbe PNG für jede Farbe, die ich brauche, enthalten.

Hilfe!

Antwort

9

CCSprite hat eine color Eigenschaft vom Typ ccColor3B:

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

Definition at line 145 of file CCSprite.h. 

Quelle: CCSprite Referenz.

Sie können leicht eine ccColor3B Struktur mit ccc3() konstruieren:

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

Referenz: ccColor3B Referenz.

+6

Justin dank das war, was ich tat ... der zusätzliche Trick natürlich ist die textureRect richtig einstellen !!! – poundev23

+0

Danke @ poundev23, das ist, was ich gesucht habe – aiham

+0

Vorsicht, dies scheint nicht in asynchronen Threads zu arbeiten. – GoldenJoe

5

Ich fand die Antwort bei cocos2d cookbook. Der folgende Code stammt aus dem ersten Kapitel dieses Buches, das für die Vorschau kostenlos ist.

-(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; 
} 

Ja, das erfordert noch eine externe Bilddatei. Aber mit diesem 1x1 winzigen 'blank.png' können Sie einfarbige Rechteck-Sprites mit beliebiger Größe und Farbe erzeugen.

+2

für das externe Bild –

21

Tun Sie es mit Code! wenn Sie mit Bilddateien zu verwirren wollen nicht, hier ist Ihre Methode:

- (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; 
} 

Dann können Sie Ihre Farbe, Größe und Deckkraft je nach Bedarf. ;)

+1

Für diejenigen, die mit dem mutierten Counter-Teil arbeiten (das ist cocos2d-x): https://gist.github.com/Mazyod/208e5fb2d7a56290a261 – Mazyod

3

Ich habe CCSprite nie so arbeiten lassen. Ich benutze nur CCLayerColor.

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

Für jeden, der über diese Frage stolpert (wie ich); der Code von Matjan scheint auf cocos 2d 3.x nicht mehr zu funktionieren. Siehe unten für eine geänderte Version, die für mich funktioniert:

+ (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; 
}