2015-10-15 84 views
0

我想通过使用自定义初始化方法来继承SKNode类。 我定制的init方法看起来是这样的:使用自定义初始化方法的SKNode子类

//interface 
@interface BlocksLayer : SKNode 
-(instancetype)initWithDirection(BlocksLayerMotionDirection)direction; 
@end 

//implementation 
-(instancetype)initWithDirection:(BlocksLayerMotionDirection)direction{ 
    self=[super init]; 
    if (self) { 
     self.direction=direction; 
     [self makeLayer]; 
    } 
    return self; 
} 

-(void)makeLayer{ 
    //scene size has always width=0 and height=0 
    NSLog(@"%f",self.scene.size.width); 
    NSLog(@"%f",self.scene.size.height); 
} 

当我初始化我的自定义方法scene.width和scene.height类始终为零。
相反,如果我使用静态节点方法初始化,则scene.size包含有效值。
你有什么想法是什么问题?
这是继承SKNode的正确方法吗?它是实现非静态自定义初始化方法的有效策略吗?
非常感谢,
多梅尼科

+0

你确定'SKNode'包含'SKScene'吗?我很确定这是另一种方式......你正在阅读的值可能只有在添加到场景后才有效,或者你可以传递一个宽度和高度来使用。 – Gliderman

+0

非常感谢您的回答。 当然,主SKScene是好的,因为我有其他自定义SKNode与静态节点方法初始化,我没有与他们的问题。 看来,当我不调用静态节点方法(例如[MyNode节点])作为初始化时,scene.size它将在initWithSize场景方法后可用。 –

回答

1

据我所知道的,[SKNode node];方法树立self.scene财产(以最有可能的默认值,像1024×768)。您提供的代码不会创建self.scene属性,因此它没有默认值。

SKNode被添加到现场,self.scene属性将指向SKScene,它被添加到(这将始终指向根SKScene即使它嵌套像SKScene-> SKNode-> SKNode)。 然后您可以阅读self.scene.size以获取场景的大小。

如果需要添加到现场之前,读出的值,你可以这样做:

  1. 转至您的自定义的init方法的参考SKScene并设置self.scene它。

  2. 您可以将大小作为参数传入。

  3. 您可以在硬编码它。

这些都是由我会做什么排名。

+0

非常感谢Gliderman。 –

+0

@DomenicoVacchiano没问题,让我知道它是怎么回事。 – Gliderman

+0

所以最后如果我理解正确的话,我们可以说如果我们想为SKNode子类编写一个自定义的init方法,并且我们必须使用相关的SKScene引用,我们必须将param作为当前SKScene的引用。 。对? –

相关问题