我正在构建一个用户在开始时选择一种武器的游戏。 我有一个SKSword类,但我希望能够设置它的类型。 我想像下面这样实现它:
JBSword *weapon = [[JBSword alloc]initWithSwordType:HeavySword HandelType:Grip];
所以我可以致电:
[weapon specialAttack];
它将执行特定于指定剑的动作(例如HeavySword)
答案 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.
}