2013-09-26 13 views
9

Używam poniższego kodu w mojej grze. Problem polega na tym, że nie jestem w stanie stworzyć wielowierszowej etykiety w spritekicie, ponieważ mogłem to zrobić za pomocą CCLabelTTF ...... Czy ktoś może mi pomóc. Również jestem w stanie użyć \ t \ n lub w moim kodu ... Dzięki za odpowiedź z góry n nie działa w Sklabel SpriteKit

SKLabelNode *winner = [SKLabelNode labelNodeWithFontNamed:@"Arial"]; 
winner.text = @"Another\nTest"; 
winner.fontSize = 32; 
winner.fontColor = [SKColor blueColor]; 
winner.position = CGPointMake(100 , 160); 
[self addChild:winner]; 

Odpowiedz

4

Wydaje się, że SKLabelNode obsługuje tylko jedną linię tekstu na raz. Nie mogę go znaleźć w dokumentacji SpriteKit czy gdziekolwiek indziej urzędnika, ale to wspomniano na 47. suwaka this WWDC presentation. Będziesz musiał użyć UILabel zamiast, który można zobaczyć wyjaśnił here.

+1

Wiem, że to stara odpowiedź, ale druga część tej odpowiedzi nurtuje mnie: "Użyj zamiast tego UILabel". Ostatnio wiedziałem, że 'UILabel' nie może być użyte wewnątrz' SKScene', a wyjaśnione tutaj wyjaśnia tylko jak używać 'UILabel', a nie jak używać go w' SKScene'. Jedyny sposób, jaki mogę wymyślić, to to, że możesz przechwycić renderowaną zawartość z ukrytej 'UILabel' i umieścić ją w' SKSpriteNode' (tak naprawdę próbuję uniknąć tego podejścia, które doprowadziło mnie do tego pytania) – Knight0fDragon

5

Można użyć NSLayoutManager do line- przerwać ciąg, aby dopasować pożądaną szerokość, jak podpowiedział this question.

Zauważ, że NSLayoutManagerjest dostępny na iOS począwszy iOS 7.

+0

dzięki za pomóż kolego. –

7

miałem ten sam problem. Stworzyłem zastępczy zamiennik dla SKLabelNode o nazwie DSMultilineLabelNode, który obsługuje zawijanie wierszy, podziały wiersza itp. Podstawowa implementacja rysuje ciąg w kontekście graficznym, a następnie stosuje go do tekstury w SKSpriteNode.

Jest ona dostępna na GitHub na:

https://github.com/downrightsimple/DSMultilineLabelNode

+0

Dzięki za pomoc kolegi. –

+0

Działa świetnie dzięki! – DavidNorman

3

Podobnie jak wiele innych Musiałem także poprawkę tego problemu. Moje podejście było o wiele prostsze niż rozwiązanie Chrisa. Zrobiłem podklasę SKLabelNode o nazwie NORLabelNode.

Jest dostępna pod numerem GitHub. Dostępny jest również kokos.

Po prostu tworzy zestaw SKLabelNodes i używa ich jako podwęzłów. Jeśli chcesz zaimplementować coś podobnego się głównym istota jest ta metoda:

- (NSArray *)labelNodesFromText:(NSString *)text{ 
    NSArray *substrings = [text componentsSeparatedByString:@"\n"]; 
    NSMutableArray *labelNodes = [[NSMutableArray alloc] initWithCapacity:[substrings count]]; 

    NSUInteger labelNumber = 0; 
    for (NSString *substring in substrings) { 
     SKLabelNode *labelNode = [SKLabelNode labelNodeWithFontNamed:self.fontName]; 
     labelNode.text = substring; 
     labelNode.fontColor = self.fontColor; 
     labelNode.fontSize = self.fontSize; 
     labelNode.horizontalAlignmentMode = self.horizontalAlignmentMode; 
     labelNode.verticalAlignmentMode = self.verticalAlignmentMode; 
     CGFloat y = self.position.y - (labelNumber * self.fontSize * self.lineSpacing); 
     labelNode.position = CGPointMake(self.position.x, y); 
     labelNumber++; 
     [labelNodes addObject:labelNode]; 
    } 

    return [labelNodes copy]; 
} 

Powyższe jest nieco uproszczona jako etykiety dziedziczą też większość innych właściwości od ich rodziców.

Przełożenie linii można zmienić za pomocą właściwości CGFloat. Poza tym działa tak jak zwykły SKLabelNode i można zmienić tekst, kolor, czcionkę, rozmiar czcionki itp. W locie, kiedy tylko masz na to ochotę.