2015-10-15 83 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的引用。 。對? –

相關問題