2009-12-12 3 views
5

Sto cercando di inserire una serie di sprite su uno strato, ma dal momento che voglio spostare tutti gli sprite come gruppo, ho creato un CocosNode, insieme alla stessa ridimensiona come schermo e posizionalo al centro dello schermo, quindi aggiungi gli Sprites a quel nodo (lightNode) invece di aggiungerli al livello.Cocos2d - più sprite su nodo principale non strato

quello che sto vedendo è che gli sprite non appaiono nei corretti (stessa?) Le posizioni rispetto a quando li ho posto in uno strato e non nel lightNode.

Ho creato un programma di test per mostrare il problema utilizzando il modello di applicazione XCode Cocos2d "Hello World" - Ho quindi sostituito il metodo -init() della classe HelloWorld in HelloWorldScene.m con questo codice.

-(id) init 
{ 
    if((self=[super init])) 
    { 
     // create my parent node that will contain all the related sprites 
     lightPane = [[CocosNode alloc] init]; 
     CGSize paneSize = { 480, 320 }; 
     [lightPane setContentSize:paneSize]; 
     [lightPane setPosition:ccp(240, 160)]; 

     // add pane to layer  
     [self addChild:lightPane z:0]; 

     // add a series of sprites to demonstrate the problem 
     int y = 40; 
     int x; 
     for (x=30; x<300; x+=20) 
     { 
      Sprite *sp = [Sprite spriteWithFile:@"pause.png"]; 
      [sp setPosition:ccp(x, y)]; 

      NSLog(@"Next sprite at position (%d, %d)", x, y); 

      [lightPane addChild:sp z:1]; 
      //[self addChild:sp z:1]; 
      x+= 20; 
     } 
    } 
    return self; 
} 

Questo codice fa riferimento a un file PNG chiamato "pause.png" - basta prendere qualsiasi piccola immagine su 30x30 pixel in termini di dimensioni e posizionarlo in questo progetto per eseguirlo.

Quello che vedrete è che gli sprite appaiono circa a metà dello schermo, a partire dal centro e dirigersi verso il lato destro.

Se si commenta la riga aggiungendo lo sprite a lightPane e si annulla la riga sotto di esso e si esegue nuovamente l'esempio, gli sprite (correttamente) verranno visualizzati nelle corde che dovrebbero.

Questo, ovviamente, ha qualcosa a che fare con la CocosNode sto usando come un genitore per gli sprite. Qualcuno capisce cosa sto facendo male qui ??

+0

domanda ben formata e buon esempio di codice! +1 – nash

risposta

3

si desidera impostare la posizione di lightPane-0,0. La posizione non è centrata di default, è l'angolo in basso a sinistra.

+0

Doh! Per qualche motivo mi aspettavo che CocosNode si comportasse come uno Sprite - che credo abbia il suo ancoraggio al centro ?? In ogni caso, hai ragione, deve essere posizionato a 0,0 non al centro. Grazie! –

+1

OPPURE - Ho impostato il nodo LightPane per ancorare a 0.5,0.5. Potrei giurare che ci ho provato prima e non ha funzionato. Ma, penso che quello che ho fatto sia stato l'ancoraggio a 240.160 e non a .5, .5 - si scopre che l'ancora è proporzionale alla dimensione del contenuto, non un punto assoluto, quindi 0,5, 0,5 indica la metà dell'altezza e metà della larghezza. –

+0

Penso che gli sprite abbiano una posizione di ancoraggio centrata in modo che le azioni si comportino come previsto. per esempio. immagina di ruotare uno sprite e farlo ruotare in basso a sinistra. –

0

Tenete presente che se si sposta in uno sprite atlante, questo non funzionerà. A meno che non si passi alla nuova versione di Cocos2d (1.9, che è in versione beta). La versione 1.9 ti consentirà di fare una genitorialità complessa degli sprite di atlante.