Что лучше всего представляет собой символ SKNode или SKSpriteNode?

enter image description hereCurrenty, мой класс выглядит примерно как

@interface Character : SKNode

@property (nonatomic, assign) CGFloat walkingSpeed;

@характера реализации

+(Character*)characterWithLevel:(BaseLevel *)level {
  return [[self alloc] initWithLevel:level];
}

-(id)initWithLevel:(BaseLevel*)level {

    if (self = [super init]) {
        _sprite = [SKSpriteNode spriteNodeWithImageNamed:level.heroTexture];
        _sprite.position = level.heroStartingPosition;

        [self addChild:_sprite];
        [level addChild:self];
    }

    return self;
}

проблема в том, что при выполнении действий против символьного узла на уровне он просто ничего не будет делать из-за того, что spritenode является анимированным. Интересно, как бы вы подошли к таким проблемам?

пример действий:

на сенсорное событие:

CGPoint location = [[touches anyObject] locationInNode:self];
[character moveToPosition:location];

Внутри Персонажа класс!--6-->

-(void)move {
    [self runAction:[SKAction repeatActionForever:[SKAction animateWithTextures:[self walkFrames]
                                                                   timePerFrame:0.1f
                                                                         resize:NO
                                                                        restore:YES]] withKey:@"moving"];
    return;
}

это ничего не делает. Единственный способ заставить его работать-это если символ был подклассом SKSpriteNode. Запуск действия против себя.спрайт тоже как-то суховато и сам узел не будет двигаться.

какие предложения?

1 ответов


Почему использует self.спрайт кажется избитым? Это совершенно справедливо.

на самом деле, с точки зрения ООП, агрегирование SKNode других видимых узлов является более универсальным подходом.

например, это позволит вам скрыть спрайт и вместо этого сделать излучатель частиц видимым, если игрок взял powerup, который делает его невидимым (или очень прозрачным) с несколькими блестящими битами вокруг него.

для достижения этого у вас будет эмиттер, как дочерний узел символ. Если символьный узел, где спрайт игрока, вы не можете превратить только спрайт невидимым, потому что это также повлияет на дочерний эмиттер.

поэтому в долгосрочной перспективе лучше агрегированный вид (видимые узлы), а не наследование их. Подумайте о символе SKNode как контроллере представления для одного или нескольких представлений (его дочерние элементы, такие как спрайты, излучатели, метки и т. д.).