2013-12-20 11 views
8

다음 코드는 예상대로 작동하지 않습니다. SPRITE KIT PROGRAMMING GUIDE, 61 및 62 페이지에 따르면 구문과 같은 정규 표현식을 사용하여 "고급 검색"을 수행 할 수 있으므로 구현을 오해하지 않는 한 정상적으로 작동합니다.고급 검색 기능이있는 SpriteKit enumerateChildNodesWithName?

SKShapeNode *myCircle = [self getCircle]; 
myCircle.name = [NSString stringWithFormat:@"CIRCLE_%d_%d", x, y]; 
myCircle.position = CGPointMake(10,10); 
[self addChild:myCircle]; 

// Lets remove ALL SKNodes that begin with the name "CIRCLE_" 
[self enumerateChildNodesWithName:@"CIRCLE_*" usingBlock:^(SKNode *node, BOOL *stop) { 
    [node removeFromParent]; 
}]; 

그러나 노드는 사라지지 않습니다. 정확한 이름을 지정하면 (예 : @"CIRCLE_10_10") 작동하지만 와일드 카드 표현 *은 보이지 않으며 @"CIRCLE_[0-9]+_[0-9]+"과 같은 것도 아니며 - 심지어 슬래시를 사용하더라도 @"/CIRCLE_[0-9]+_[0-9]+"입니다.

내가 뭘 잘못하고 있니?

편집 :이 작품과 내가 대신 substring'ing의 일치하지만, 스프라이트 키트 구현 (이상적) 작업을 얻을 수 있었으면 정규 표현식을 구현할 수 .

[[self children] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    SKNode *node = (SKNode *)obj; 
    if ([[node.name substringWithRange:NSMakeRange(0, 7)] isEqual: @"CIRCLE_"]) { 
     [node removeFromParent]; 
    } 
}]; 
+1

나에게 맞는 것 같습니다. @ "/ CIRCLE_ *"또는 @ "// CIRCLE_ *"을 시도하고 그것이 무엇을 얻는 지보십시오. 원 노드가 실제로 열거/childNodeWithName 메시지를 보내는 노드 (자체)의 직접 자식 노드인지 확인하십시오. – LearnCocos2D

+0

그 중 하나가 작동하지 않습니다 너무 전에 (별표 생략) 및 슬래시 (내 펄 정규식 경험에서) 놀고. –

+0

고마워 LearnCocos2D; 예, 그들은 자기의 자식 노드입니다. 실제로, 위의 첫 번째 편집에서 self [self children] : ref'ing while work를 수행하는 블록을 보여줍니다. :) –

답변

0

iOS 및 OS-X에서 Xcode의 현재 및 베타 버전 모두에서 다음 코드 변형을 시도했습니다.

SKScene *scene = [[SKScene alloc] initWithSize:self.gameView.frame.size]; 

    for (int x = 0; x < 20; x++) 
    { 
     for (int y = 0; y < 20; y++) 
     { 
      CGPathRef myPath = CGPathCreateWithEllipseInRect(CGRectMake(0, 0, 20, 20), NULL); 
      SKShapeNode *myCircle = [[SKShapeNode alloc] init]; 
      myCircle.path = myPath; 
#if TARGET_OS_IPHONE 
      myCircle.fillColor = [UIColor redColor]; 
#else 
      myCircle.fillColor = [NSColor redColor]; 
#endif 
      myCircle.name = [NSString stringWithFormat:@"CIRCLE_%d_%d", x, y]; 
      myCircle.position = CGPointMake(20*x,20*y); 
      [scene addChild:myCircle]; 
      CGPathRelease(myPath); 
     } 
    } 

    [self.gameView presentScene:scene]; 

모든 샘플 표현식은 두 버전의 Mac에서 모두 작동합니다. 그러나 iOS에서는 개발자 미리보기에서만 작동했습니다.

+0

또한이 오래된 스레드 (https://devforums.apple.com/message/884255#884255)를 참조하십시오. – nzeltzer