Подкласс SKNode с пользовательским методом инициализации

Я пытаюсь создать подкласс класса 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 всегда равны нулю.
Вместо этого, если я использую инициализацию статического метода node, scene.size содержит допустимые значения.
Вы знаете, в чем проблема?
Является ли это правильным способом создания подкласса SKNode и допустимой ли стратегией реализации нестатического пользовательского метода инициализации?
Большое спасибо,
Доменико


person Domenico Vacchiano    schedule 15.10.2015    source источник
comment
Вы уверены, что SKNode содержит SKScene? Я почти уверен, что все наоборот... Значения, которые вы читаете, могут быть действительны только после добавления в сцену, или вы можете просто передать ширину и высоту для использования.   -  person Gliderman    schedule 15.10.2015
comment
Большое спасибо за ваш ответ. Конечно, с основным SKScene все в порядке, потому что у меня есть другие пользовательские SKNode, инициализированные методом статического узла, и у меня нет проблем с ними. Кажется, что когда я не вызываю метод статического узла (например, [узел MyNode]) в качестве инициализации, сцена.размер будет доступен после метода сцены initWithSize.   -  person Domenico Vacchiano    schedule 15.10.2015


Ответы (1)


Насколько я могу судить, метод [SKNode node]; устанавливает свойство self.scene (с наиболее вероятными значениями по умолчанию, что-то вроде 1024x768). Предоставленный вами код не создает свойство self.scene, поэтому у него нет значений по умолчанию.

Когда SKNode добавляется в сцену, свойство self.scene будет указывать на SKScene, к которому оно было добавлено (это всегда будет указывать на корень SKScene, даже если он вложен, как SKScene->SKNode->SKNode). Затем вы можете прочитать self.scene.size, чтобы получить размер сцены.

Если вам нужно прочитать значения перед добавлением в сцену, вы можете сделать:

  1. Передайте ссылку на SKScene в свой собственный метод инициализации и установите для него self.scene.

  2. Вы можете передать размер в качестве параметра.

  3. Вы можете жестко закодировать его.

Они оцениваются по тому, что я бы сделал.

person Gliderman    schedule 15.10.2015
comment
@DomenicoVacchiano Нет проблем, дай мне знать, как дела. - person Gliderman; 16.10.2015
comment
Итак, наконец, если я правильно понял, мы можем сказать, что если мы хотим написать собственный метод инициализации для подкласса SKNode и нам нужно использовать соответствующую ссылку на SKScene, мы должны передать в качестве параметра ссылку на текущий SKScene... правильно? - person Domenico Vacchiano; 16.10.2015