适当的SKSpriteNode子类化和实例初始化



我正在尝试子类SKSpriteNode,以便我可以使用它来创建具有不同属性的游戏不同的字符。我知道这应该是一个微不足道的任务,但是我很难理解在创建实例时如何初始化变量。在标题中我有:

#import <SpriteKit/SpriteKit.h>
@interface MyClass : SKSpriteNode 
@property int myVariable;
@end

而在实现中:

#import "MyClass.h"
@interface MyClass ()
@end
@implementation MyClass
@synthesize myVariable;
- (id)init {
    if (self = [super init]) {
        myVariable = 100;
    }
    return self;
}

在场景中创建节点时:

@implementation GameScene
{
    MyClass *mySprite;
}
- (void)didMoveToView: (SKView *) view
{
    mySprite = [MyClass spriteNodeWithImageNamed:@"image.png"];
}

myVariable的值是0,我认为这意味着spriteNodeWithImageNamed不执行init方法。如果我使用:

mySprite = [[MyClass alloc] init]; // or mySprite = [MyClass new];
mySprite = [MyClass spriteNodeWithImageNamed:@"image.png"];

变量名称被正确设置为100,但随后spriteNodeWithImageNamed恢复为0。

我也试过了:

mySprite = [[MyClass alloc] init]; // or mySprite = [MyClass new];
[mySprite setTexture:[SKTexture textureWithImageNamed:@"image.png"]];

在这种情况下,myVariable的值是正确的,但是当我将节点添加到场景中时没有出现图像。使用spriteNodeWithImageNamed时调用什么初始化方法?我是否不正确地重写SKSpriteNode初始化方法?

您已经正确地完成了创建类的所有操作,但是您需要记住,您正在调用工厂方法spriteNodeWithImageNamed,然后它将自己进行初始化和分配。因此,如果您想使用您的自定义init方法,您还需要覆盖工厂方法。

在MyClass的实现内部,重写方法以调用初始化器:

+ (instancetype) spriteNodeWithImageNamed:(NSString *)imageName{
    MyClass *newClass = [[MyClass alloc] init];
    SKTexture *spriteTexture = [SKTexture textureWithImageNamed:imageName];
    newClass.size = spriteTexture.size;
    newClass.texture = spriteTexture;
    return newClass;
}

希望这对你有帮助,如果你有问题请告诉我。

*EDIT:我实际上有点想放弃这个,只是因为SKSpriteNode没有init方法(或者至少我们不知道)。所以,除非你想深入了解苹果的奥秘,否则就这样做吧:

+ (instancetype) spriteNodeWithImageNamed:(NSString *)imageName{
    MyClass *newClass = [[MyClass alloc] initWithImageNamed:imageName];
    newClass.myVariable = 100;
    return newClass;
}

您可以重写initWithImage以放入myVariable,但重点是我将避免尝试使用SKSpriteNode的init初始化器。

我是这样做的。创建您自己的自定义init方法,并简单地调用默认的spritenode initWithImage。

-(id)initShipWithType:(ShipType)type {
    self = [super initWithImageNamed:[self getShipSprite:type]];
    if (self) {
    }
    return self;
}

最新更新