删除移动节点时如何避免SKNode的闪烁?

时间:2017-08-26 07:19:51

标签: ios objective-c sprite-kit

我正在使用一个小游戏,我的节点就像这样移动:

    SKAction * actionMove = [SKAction moveToY:HEIGHT + self.frame.size.height / 2 duration:actualDuration];
[self runAction:[SKAction sequence:@[actionMove, loseAction]] withKey:@"start"];

并且我从另一个视图中忽略它,它只是称之为:

- (void)dissmissBubbleWithType:(BubbleType)type{
__block BOOL isDismiss = NO;
NSString *name = [[ResManager sharedManager] nameFromBubbleType:type];
[self enumerateChildNodesWithName:name usingBlock:^(SKNode * _Nonnull node, BOOL * _Nonnull stop) {
    BubbleNode *bubbleNode = (BubbleNode *)node;
    isDismiss = YES;
    [bubbleNode cracked];
}];
if (isDismiss) {
    [self.bubbleDelegate dismissBubbleWithType:type];
}

}

当我解析一个类型时,我使用enumerateChildNodesWithName usingBlock 删除我的节点;

这就是bubbleNode破解了,我用它来播放一个gif并删除它;

- (void)cracked{
self.name = @"cracked";
[self removeAllActions];
SKAction * actionMoveDone = [SKAction animateWithTextures:[ResManager sharedManager].bubbleCrackArray timePerFrame:0.2];
SKAction *done = [SKAction removeFromParent];
[self runAction:[SKAction sequence:@[actionMoveDone,done]]];

}

现在的问题是当我调用dissmissBubbleWithType时,节点会闪烁到较旧的位置。 我认为原因是当我调用dissmissBubbleWithType和enumerateChildNodesWithName:name时,节点的position.y为100,但在删除时,position.y为90(因为它正在移动)。 我试过某种方式,比如 1.removeAllActions然后播放gif 2.removeFromParent没有播放gif 3.在场景中使用foreach.children 但它仍然闪烁

所以pease帮助我,非常感谢:)。

1 个答案:

答案 0 :(得分:0)

最后我解决了。 我将enumerateChildNodesWithName放入子线程,并将[bubbleNode破解]放入主线程。 所以这个枚举不会影响节点的移动。