什么最能代表角色SKNode或SKSpriteNode?

时间:2013-11-07 21:39:37

标签: ios sprite-kit

enter image description here当前,我的班级看起来像

@interface Character : SKNode

@property (nonatomic, assign) CGFloat walkingSpeed;

@implementation Character

+(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;
}

问题是,当对级别中的Character节点运行操作时,由于SpriteNode是动画的,因此它不会做任何事情。我想知道你们会怎样处理这类问题?

行动举例:

触摸事件:

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

Inside Character类

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

这没有任何作用。只有我可以让它工作的方法是如果Character是SKSpriteNode的子类。对self.sprite运行操作似乎也有点hacky,节点本身也不会移动。

有什么建议吗?

1 个答案:

答案 0 :(得分:8)

为什么使用self.sprite看起来很hacky?这完全有效。

事实上,从OOP的角度来看,聚合其他可见节点的SKNode是更通用的方法。

例如,它允许你隐藏精灵,而不是让一个粒子发射器可见,如果玩家拿起一个让他看不见(或非常透明)的通电,只有几个闪闪发光的位置。

要实现这一点,您将有一个发射器作为字符节点的子节点。如果玩家精灵的角色节点,你不能只是将精灵变为不可见,因为这也会影响子发射器。

因此,从长远来看,最好聚合视图(可见节点)而不是子类化它们。可以将Character SKNode视为一个或多个视图的视图控制器(其子像精灵,发射器,标签等)。

相关问题