[ios]初始化子类不工作

发布时间: 2017/4/3 17:57:42
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想要产卵到屏幕 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:

你犯了错误,在创建一个属性 SKSpriteNode (_seagull) 在 SKSpriteNode (海鸥)。

在你 init 你初始化方法, _seagullSKSpriteNode ,但何时产卵海鸥,你做的一切只是创建并添加一个类的实例 Seagull 到现场,与无关 _seagull 实际上包含一只海鸥的纹理。要解决这个问题,您需要返回 seaGull.seagullspawnSeagull ,这不是我害怕的最佳实践。

然而,仍有几个地方需要在您的代码中修复。

In spawnSeagull:

  • CGPointMake(self.size.width * 0.5, self.size.height * 0.5)是错误的因为你不会以这种方式得到现场的一半大小。
  • 你应该调用 [self addChild:seaGull] 在你的GameScene,因为你想要将其添加到现场,不到一个子类的 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,调用类方法

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

找到更多的示例代码在这个苹果文档,它是如何创造 shipSprite 将帮助。

官方微信
官方QQ群
31647020