Init子类不起作用

时间:2015-09-09 15:16:22

标签: ios objective-c sprite-kit init skspritenode

我想通过子类将spritenodes生成到屏幕上,但它并没有显示在屏幕上。有人知道我做错了吗?

子类

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

1 个答案:

答案 0 :(得分:1)

SKSpriteNode(Seagull)中创建属性 SKSpriteNode(_seagull)时出错。

init方法中,您将_seagull初始化为SKSpriteNode,但是何时生成海鸥,您只需创建并添加类Seagull的实例到现场,与实际包含海鸥纹理的_seagull无关。要解决此问题,您需要在seaGull.seagull中返回spawnSeagull,这不是我担心的最佳做法。

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

spawnSeagull

  • CGPointMake(self.size.width * 0.5, self.size.height * 0.5)是错误的,因为你不会以这种方式获得场景的一半大小。
  • 您应该在 GameScene 中调用[self addChild:seaGull],因为您要将其添加到场景中,而不是SKSpriteNode的子类。

viewDidLoad(推荐didMoveToView)中:

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

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

删除init,并在子类中添加一个类方法

+ (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将有所帮助。