2009-12-12 17 views
5

Ich versuche, eine Reihe von Sprites auf einer Ebene zu platzieren, aber da ich alle Sprites als Gruppe verschieben möchte, habe ich einen CocosNode erstellt, legen Sie es auf die gleiche Größe wie der Bildschirm und positionieren Sie es in der Mitte des Bildschirms, dann fügen Sie die Sprites zu diesem Knoten (LightNode), anstatt sie der Ebene hinzuzufügen.Cocos2d - mehrere Sprites auf Elternknoten nicht Schicht

Was ich sehe, ist, dass die Sprites nicht in der richtigen (gleichen?) Positionen im Vergleich zu wenn ich sie in einer Schicht und nicht in der LightNode platziert.

Ich habe ein Testprogramm erstellt, um das Problem mit der XCode Cocos2d-Anwendungsvorlage "Hello World" zu zeigen - Ich habe dann die -init() -Methode der HelloWorld-Klasse in HelloWorldScene.m mit diesem Code ersetzt.

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

Dieser Code verweist auf eine PNG-Datei „pause.png“ genannt - nehmen Sie einfach jede kleine Bild über 30x30 Pixel groß und legen Sie es in diesem Projekt um es auszuführen.

Was Sie sehen werden ist, dass die Sprites etwa auf halber Höhe des Bildschirms erscheinen, beginnend in der Mitte und auf der rechten Seite.

Wenn Sie die Zeile auskommentieren und das Sprite zu lightPane hinzufügen, die Zeile darunter entkommentieren und das Beispiel erneut ausführen, werden die Sprites (korrekt) an den Koordinaten angezeigt, die sie verwenden sollen.

Das hat offensichtlich etwas mit dem CocosNode zu tun, den ich als Elternteil für die Sprites benutze. Wer sieht was ich hier falsch mache ??

+0

gut geformte Frage und gute Codebeispiel! +1 – nash

Antwort

3

Sie möchten die Position lightPane auf 0,0 setzen. Die Position ist standardmäßig nicht zentriert, es ist die linke untere Ecke.

+0

Doh! Aus irgendeinem Grund habe ich erwartet, dass sich der CocosNode wie ein Sprite verhält - von dem ich glaube, dass er seinen Anker im Zentrum hat? Wie auch immer, Sie haben Recht, es muss Position bei 0,0 nicht in der Mitte sein. Vielen Dank! –

+1

ODER - Ich setze den lightPane-Knoten auf 0,5,0,5. Ich könnte schwören, dass ich das früher versucht habe und es hat nicht funktioniert. Aber, ich denke, was ich getan habe, war der Anker auf 240.160 und nicht .5, .5 - es stellt sich heraus, dass der Anker proportional zur Größe des Inhalts ist, nicht ein absoluter Punkt, also .5, .5 bedeutet die halbe Höhe und die halbe Breite. –

+0

Ich denke, dass Sprites eine zentrierte Ankerposition haben, so dass sich Aktionen wie erwartet verhalten. z.B. stell dir vor, ein Sprite zu drehen und es von unten nach links rotieren zu lassen. –

0

Denken Sie daran, dass dies nicht funktioniert, wenn Sie zu einem Sprite-Atlas wechseln. Nicht, wenn Sie nicht auf die neue Version von Cocos2d (1.9, die in der Betaversion ist) wechseln. Mit der Version 1.9 können Sie komplexe Parsen von Atlas-Sprites durchführen.

Verwandte Themen