2009-12-12 12 views
5

Próbuję umieścić serię spritesów na warstwie, ale ponieważ chcę przenieść wszystkie sprity jako grupę, stworzyłem CocosNode, ustawię to na tym samym rozmiar jako ekran i umieść go na środku ekranu, a następnie dodaj sprite do tego węzła (lightNode) zamiast dodawać je do warstwy.Cocos2d - wiele duszków na macierzystym węźle nie warstwa

To, co widzę, to to, że duchy nie pojawiają się w poprawnych (takich samych?) Pozycjach w porównaniu do sytuacji, kiedy umieszczam je w warstwie, a nie w węźle światła.

Zrobiłem program testowy, aby pokazać problem za pomocą szablonu aplikacji Coco2d XCode "Hello World" - I następnie zastąpił metodę -init() klasy HelloWorld w HelloWorldScene.m tym kodem.

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

Kod ten odnosi się do pliku PNG o nazwie „pause.png” - wystarczy wziąć każdy mały obraz o rozmiarze 30x30 pikseli i umieścić ją w tym projekcie, aby go uruchomić.

To, co zobaczysz, to pojawienie się ikonek mniej więcej w połowie ekranu, zaczynając od środka i przechodząc w prawą stronę.

Jeśli skomentujesz linię dodającą duszek do lekkiej planszy i anulujesz komentarz poniżej linii, i ponownie uruchomisz próbkę, zobaczysz, że duchy (poprawnie) pojawiają się na współrzędnych, które powinny.

To oczywiście ma coś wspólnego z CocosNode, którego używam jako rodzica dla duszków. Czy ktoś widzi, co robię źle?

+0

dobrze sformułowane pytanie i dobry przykład kodu! +1 – nash

Odpowiedz

3

Chcesz ustawić pozycję lightPane na 0,0. Pozycja nie jest domyślnie wyśrodkowana, jest to lewy dolny róg.

+0

Doh! Z jakiegoś powodu spodziewałem się, że CocosNode będzie zachowywał się jak Sprite - co, jak sądzę, ma swoją kotwicę ustawioną na środek? Tak czy inaczej, masz rację, to musi być pozycja w punkcie 0,0, nie w centrum. Dzięki! –

+1

OR - Ustawiam węzeł LightPane na zakotwiczenie na 0.5,0.5. Mógłbym przysiąc, że próbowałem tego wcześniej i to nie działało. Ale myślę, że to, co zrobiłem, ustawiło kotwicę na 240,160, a nie na .5, .5 - okazuje się, że kotwica jest proporcjonalna do wielkości treści, a nie punktu absolutnego, więc .5, .5 oznacza połowę wysokości i połowę szerokości. –

+0

Myślę, że sprite mają wypośrodkowaną pozycję zakotwiczenia, więc działania zachowują się zgodnie z oczekiwaniami. na przykład wyobraź sobie obracanie sprite'a i obracanie go od dołu po lewej. –

0

Należy pamiętać, że jeśli przejdziesz do atlasu sprite, to nie zadziała. Nie, chyba że przeniesiesz się do nowej wersji Cocos2d (1.9, która jest w wersji beta). Wersja 1.9 pozwoli ci na złożoność rodzicielstwa sprite'ów atlasowych.

Powiązane problemy