SpriteKit enumerateChildNodesWithName与高级搜索?

时间:2013-12-20 20:26:03

标签: objective-c sprite-kit

以下代码无法按预期工作。根据SPRITE KIT编程指南,第61和62页,可以使用正则表达式语法来执行“高级搜索”,因此,除非我误解了实现,否则这应该有用吗?

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]+"

我做错了什么?

修改: 这个工作和我可以实现正则表达式匹配而不是子串,但希望让Sprite Kit实现工作(理想情况下)。

[[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 个答案:

答案 0 :(得分:0)

我在iOS和OS-X上的Xcode的当前版本和Beta版本中尝试了以下代码变体。

    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];

所有示例表达式都适用于两个版本的SDK中的Mac。但是,在iOS上,他们只在开发者预览版中工作。