enumerateChildNodesWithName 没有停止

Posted

技术标签:

【中文标题】enumerateChildNodesWithName 没有停止【英文标题】:enumerateChildNodesWithName not stopping 【发布时间】:2014-09-18 18:03:49 【问题描述】:

我正在构建一个大致遵循 raywenderlich.com 的 How To Make a Game Like Space Invaders with Sprite Kit Tutorial: Part 1 教程的 Sprite Kit“入侵者”游戏

我遇到了enumerateChildNodesWithName 方法的问题。我正在使用该方法简单地沿其 X 轴(从左到右)移动 SKSpriteNode,并在节点位于框架右边缘 100 点以内时停止移动。

这是我对enumerateChildNodesWithName 方法的使用:

-(void)updateMoveInvaders:(NSTimeInterval)currentTime

    [self enumerateChildNodesWithName:invaderName usingBlock:^(SKNode *node, BOOL *stop) 

        [node setPosition:CGPointMake((node.position.x + 1), node.position.y)];

        if (CGRectGetMaxX(node.frame) > (self.frame.size.width - 100))
            *stop = YES;
            NSLog(@"should stop");
        
    ];

逻辑似乎是正确的,因为当节点在框架边缘的 100 点内时,字符串“应该停止”被记录到控制台,但枚举并没有停止并且节点继续向右移动。为什么会这样?

我这样称呼这个方法:

- (void)update:(NSTimeInterval)currentTime

    [self updateMoveInvaders:currentTime];

完整的可执行代码(Xcode 项目)可以在GitHub找到

【问题讨论】:

【参考方案1】:

这会在每一帧调用 updateMoveInvaders:

- (void)update:(NSTimeInterval)currentTime

    [self updateMoveInvaders:currentTime];

这意味着对于每个具有invaderName 的节点,每帧都会执行此操作:

[node setPosition:CGPointMake((node.position.x + 1), node.position.y)];

如果您每帧继续执行此行一次,节点会一直向右移动,这不是很明显吗?

【讨论】:

好的。那时对更新机制非常缺乏了解。谢谢

以上是关于enumerateChildNodesWithName 没有停止的主要内容,如果未能解决你的问题,请参考以下文章