SpriteKit检测节点是否从父节点中删除

时间:2014-01-31 16:45:12

标签: ios objective-c sprite-kit

每次删除节点时都会调用一个方法吗?还是加了?

沿着touchesBegan的条件,每次触摸屏幕时都会调用该方法。

touchesMoved在触摸和移动节点时调用的方法。

当节点获得removeFromParent时,是否有这样的方法被调用?

我目前正在使用update方法来检测节点是否仍然存在,如:

SKNode *n = [self childNodeWithName: @"n"];
if (!n)
{
    // no n
    if (life != 0)
    {
        [self addChild:_n);
        life--;
    }
}

现在,当该节点丢失时,我删除1个生命,然后再次添加该节点。

问题是更新方法运行得太快,每次删除节点时都会删除2个生命。我相信这是因为添加节点比更新方法慢一点。因此,在检测到节点再次出现之前,更新方法需要2个循环。

2 个答案:

答案 0 :(得分:3)

没有这样的方法。但你可以创建一个。

创建(例如)SKSpriteNode的子类并覆盖所有“remove”方法(或仅覆盖您正在使用的方法)。在该方法中,向需要接收删除事件的任何对象发送消息,或发送通知并注册其他对象以接收该通知。不要忘记调用重写方法的超级实现。

答案 1 :(得分:2)

如果您在更新

中运行此行
SKNode *n = [self childNodeWithName: @"n"];
if (!n)

该语句将永久运行,直到您停止游戏或您的节点不等于nil

更正您需要创建 BOOL

的行为
BOOL _shouldProceed;

如果需要,请更改名称

当您将节点集 BOOL 值创建为true或是

- (void)createNode {
    _shouldProceed = YES;

    // Your implementation for the node
}

并将此内置更新

SKNode *n = [self childNodeWithName:@"n"];

if (!n && _shouldProceed) {
    _shouldProceed = NO;

    if (life != 0) {
        [self createNode];
         life--;
    }
}

如果您的节点等于nil且 BOOL 值等于true / yes 您需要将 BOOL 值设置为false / NO

采用这种方法,这个陈述只会发生一次

使用

创建新节点时
[self createNode];

BOOL 值设置为true / YES

这应该可以解决你的问题

祝你好运!!