комплект спрайтове - Получавайте известие, когато възел е добавен към сцена

Имам подклас от SKNode, чийто искам да получавам известия, когато бъдат добавени към сцена. Знаейки, че SKNode има свойство, наречено scene, се опитах да използвам KVO, но по някаква причина не работи.

- (id)init
{
    self = [super init];
    if (self)
    {
        [self addObserver:self forKeyPath:@"scene" options:NSKeyValueObservingOptionNew context:nil];
    }
    return self;
}

- (void)dealloc
{
    [self removeObserver:self forKeyPath:@"scene"];
}

+ (instancetype)gameWorld
{
    return [[self alloc] init];
}

#pragma mark - Observer methods

// never called
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (object == self && [keyPath isEqualToString:@"scene"])
    {
        KKScene *scene = change[NSKeyValueChangeNewKey];
        NSLog(@"%@", scene);
    }
}

Има ли все пак да получите известие, когато възел е добавен към сцена? Или може би KVO работи добре, но направих нещо нередно тук?


person Yaman    schedule 13.03.2014    source източник
comment
възможен дубликат на SKSpriteNode, добавен към/премахнат от родителска кука   -  person LearnCocos2D    schedule 14.03.2014
comment
Разбирам нещо оттогава. Свойството scene се задава само ако сцената е директният родител на възела. Мислех, че дори поддецата ще имат сцената   -  person Yaman    schedule 14.03.2014
comment
Можете да наблюдавате родителското свойство на възлите вместо свойството сцена.   -  person ZeMoon    schedule 14.03.2014
comment
@Yaman това не е правилно, сцената е зададена за всички възли, но само след като възелът е добавен като дъщерен към друг възел, който от своя страна също е дъщерен на възел, който вече има валидно свойство на сцена ( или е самата сцена). По принцип свойството на сцена е валидно само ако възелът действително е част от графиката на сцената. KVO вероятно не работи, защото това свойство не е съвместимо с KVO, Sprite Kit зад кулисите е C++ рендър и заобикаля голяма част от Objective-C режийните.   -  person LearnCocos2D    schedule 14.03.2014
comment
@LearnCocos2D мхх разбирам. Благодаря за тези подробности!   -  person Yaman    schedule 14.03.2014


Отговори (2)


Моето решение за това е да имам метод, който добавя възли и общ подклас на SKNode, на който базирам всичките си възли. Този подклас има "-(void)onEnterScene", който се извиква от метода add'er веднага след добавянето му към сцената.

person Theis Egeberg    schedule 14.03.2014

Заменете тази функция във вашия подклас SKScene:

-(void)addChild:(SKNode *)node {
    [super addChild:node];
    NSLog(@"added child");
}

Вече е отговорено тук

person michaelsnowden    schedule 31.08.2014