初始化子类不起作用

Init subclass does not work

我想通过子类生成 spritenode 以进行屏幕显示,但它没有显示在屏幕上。有人知道我做错了什么吗?

子类

@implementation Seagull

-(id)init
{
    self = [super init];
    if (self) {
        _atlas = [SKTextureAtlas atlasNamed:@"Seagull"];
        _seagull = [SKSpriteNode spriteNodeWithTexture:[_atlas textureNamed:@"Seagull1"]];
        _seagull.size = CGSizeMake(156.8, 115.4);

        NSArray *flyFrames = @[[_atlas textureNamed:@"Seagull1"],
                               [_atlas textureNamed:@"Seagull2"]];

        _flyAnimation = [SKAction repeatActionForever:[SKAction animateWithTextures:flyFrames timePerFrame:0.15 resize:NO restore:NO]];

        [_seagull runAction:_flyAnimation];
    }
    return self;
}

@end

已创建子类对象

-(Seagull *)spawnSeagull
{
    Seagull *seaGull = [[Seagull alloc] init];
    seaGull.position = CGPointMake(self.size.width * 0.5, self.size.height * 0.5);
    NSLog(@"seagull postion.x = %f && position.y = %f", seaGull.position.x, seaGull.position.y);
    [self addChild:seaGull];

    return seaGull;
}

添加到viewDidLoad中的场景

[self spawnSeagull];

您在 class[=58 中创建 属性 SKSpriteNode (_seagull) 时出错=] SKSpriteNode(海鸥)。

在您的 init 方法中,您将 _seagull 初始化为 SKSpriteNode,但是当生成海鸥时,您所做的只是创建并添加 [=67= 的实例] Seagull 到场景,与 _seagull 无关,实际上包含海鸥的纹理。要解决此问题,您需要在 spawnSeagull 中 return seaGull.seagull,恐怕这不是最佳做法。

但是,您的代码中仍有几个地方需要修复。

spawnSeagull中:

  • CGPointMake(self.size.width * 0.5, self.size.height * 0.5)是错误的,因为这样你不会得到场景的一半大小。
  • 你应该在 GameScene 中调用 [self addChild:seaGull],因为你想将它添加到场景中,而不是 [=] 的子 class 12=].

viewDidLoad(推荐didMoveToView):

  • 正如@timgcarlson 评论的那样,您需要一个对象来为其分配 spawnSeagull 的 return 结果。

我在下面添加完整的代码:

去掉init,在subclass,

中添加一个class方法
+ (Seagull *)spawnSeagull
{
    SKTextureAtlas *atlas = [SKTextureAtlas atlasNamed:@"Seagull"];
    Seagull *seagull = [Seagull spriteNodeWithTexture:[atlas textureNamed:@"Seagull1"]];

    // seagull.size = CGSizeMake(156.8, 115.4);
    // May be set scale of seagull is better? like:
    seagull.scale = 2.0;

    NSArray *flyFrames = @[[atlas textureNamed:@"Seagull1"],
                           [atlas textureNamed:@"Seagull2"]];
    SKAction *flyAnimation = [SKAction repeatActionForever:[SKAction animateWithTextures:flyFrames timePerFrame:0.15 resize:NO restore:NO]];

    [seagull runAction:flyAnimation];

    return seagull;
}

GameScene,

中调用class方法
- (void)didMoveToView:(SKView *)view
{
    Seagull *seagull = [Seagull spawnSeagull];
    seagull.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    [self addChild:seagull];
}

this Apple doc 中查找更多示例代码,它如何创建 shipSprite 会有所帮助。