6

在此处输入图像描述目前,我的课看起来像

@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];

内部字符类

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

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

有什么建议么?

4

1 回答 1

8

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

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

例如,如果玩家拾取了一个使他不可见(或非常透明)的道具,而他周围只有一些闪闪发光的部分,它可以让您隐藏精灵并让粒子发射器可见。

为此,您将拥有一个发射器作为角色节点的子节点。如果玩家精灵所在的角色节点,您不能只将精灵设为不可见,因为这也会影响子发射器。

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

于 2013-11-07T23:26:54.520 回答