【问题标题】:SKNode subclass with custom init method具有自定义 init 方法的 SKNode 子类
【发布时间】:2015-10-15 15:34:24
【问题描述】:

我正在尝试使用自定义 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 始终为零。
相反,如果我使用静态 node 方法初始化,scene.size 包含有效值。
你知道有什么问题吗?
这是子类化 SKNode 的正确方法吗?它是实现非静态自定义初始化方法的有效策略吗?
非常感谢,
多梅尼科

【问题讨论】:

  • 您确定SKNode 包含SKScene 吗?我很确定情况正好相反...您正在读取的值可能仅在添加到场景后才有效,或者您可以只传递宽度和高度以供使用。
  • 非常感谢您的回答。当然主 SKScene 没问题,因为我有其他自定义 SKNode 用静态节点方法初始化,我对它们没有问题。看来当我不调用静态节点方法(例如[MyNode节点])作为初始化时,在initWithSize场景方法之后它的scene.size就可用了。

标签: ios objective-c sprite-kit sknode


【解决方案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. 您可以硬编码。

这些是按我会做什么排名的。

【讨论】:

  • @DomenicoVacchiano 没问题,告诉我进展如何。
  • 所以最后如果我理解正确的话,我们可以说如果我们想为一个 SKNode 子类编写一个自定义的 init 方法并且我们必须使用相关的 SKScene 引用,我们必须作为参数传递当前 SKScene 的参考...对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 2016-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多