创建自定义类型的SKSpriteNode

时间:2013-11-03 22:25:38

标签: ios cocoa-touch custom-component sprite-kit skspritenode

我正在构建一个用户在开始时选择一种武器的游戏。 我有一个SKSword类,但我希望能够设置它的类型。 我想像下面这样实现它:

JBSword *weapon = [[JBSword alloc]initWithSwordType:HeavySword HandelType:Grip];

所以我可以致电:

[weapon specialAttack];

它将执行特定于指定剑的动作(例如HeavySword)

1 个答案:

答案 0 :(得分:4)

选项1

您正在尝试做的是内置于Objective-C。在specialAttack类中定义名为Sword的方法:

@interface Sword : SKNode

    -(void) specialAttack;

@end

然后写一个空白的实现:

@implementation Sword

    -(void) specialAttack
    {
        return;
    }

@end

现在,使用HeavySword作为基类创建一个名为Sword的子类:

@interface HeavySword : Sword

    -(void) specialAttack;

@end

...

@implementation HeavySword

-(void) specialAttack
{
    // HeavySword code here
}

现在,只需创建HeavySword类型的对象:

Sword *weapon = [[HeavySword alloc] init];

...

[weapon specialAttack];

我还建议使用除SK以外的自己的前缀,这意味着类是Sprite Kit的一部分。

选项2

使用typedef enum定义一些常量:

typedef enum {
    kHeavySwordType,
    kLightSwordType,
    kDualSwordType,
    ...
} SwordType;

typedef enum {
    kWoodHandleType,
    kGoldHandleType,
    kDiamondHandleType,
    ...
} HandleType;

然后,您可以在界面中声明一些属性和init方法:

@interface Sword : SKNode

    @property (nonatomic) SwordType type;
    @property (nonatomic) HandleType handle;

    -(id) initWithType:(SwordType) type handle:(HandleType) handle;

    -(void) specialAttack;

@end

最后,在您的实施中:

@implementation Sword

-(id) initWithType:(SwordType) type handle:(HandleType) handle
{
    if(self = [super init]) {
        _type = type;     // Use _type within int, and self.type everywhere else
        _handle = handle; // Same thing here.
    }
    return self;
}

-(void) specialAttack
{
    // Code goes here
    // Use self.type and self.handle to access the sword and handle types.
}