1

我正在玩 SpriteKit,对可能是一个非常愚蠢的错误感到目瞪口呆。我正在扩展一个 SKSpriteNode,Fish,声明如下:

 @interface Fish : SKSpriteNode

 @property BOOL direction;
 @property FishSize fishSize;

 + (id) spriteNodeWithImageNamed : (NSString *) name;

 - (id) initWithImageNamed :(NSString *)name;
 - (void) setSize:(FishSize)s;


 @end

我这样重写 spriteNodeWithImageNamed 类方法:

 + (id) spriteNodeWithImageNamed : (NSString *) name
 {
     Fish * f = [super spriteNodeWithImageNamed : name];
     f.direction = right;
     f.fishSize = SmallSize;
     return f;
 }

这是错误的,因为精灵没有被加载。另一方面,如果我只是在常规 SKSpriteNode 上调用 spriteNodeWithImageNamed 方法,它就可以正常工作:

//this gets initialized to the proper size
SKSpriteNode * node = [SKSpriteNode spriteNodeWithImageNamed:picName];

// this is initialized to size (0,0)
Fish * fish = [Fish spriteNodeWithImageNamed:picName];

我究竟做错了什么?

4

2 回答 2

1

子类化对我来说非常好:

@interface Fish : SKSpriteNode
+ (id) spriteNodeWithImageNamed : (NSString *) name;
@end

@implementation Fish
+ (id) spriteNodeWithImageNamed : (NSString *) name
{
    Fish * f = [super spriteNodeWithImageNamed : name];
    return f;
}
@end

像这样使用它:

Fish* f = [Fish spriteNodeWithImageNamed:@"dummy_case.png"];
[self addChild:f];

// prints 16.0, 16.0 in my case:
NSLog(@"%f, %f", f.size.width, f.size.height);

精灵正常显示。

如果你指的是FishSize它取决于它是什么FishSize。它是 CGSize typedef 还是枚举或完全是其他东西?

于 2013-11-07T02:22:33.260 回答
1

我认为问题很简单。

你写了这个。

- (void) setSize:(FishSize)s;

它覆盖- (void)setSize:(CGSize)size. 所以 size 不会被初始化。
(Objective-C 不支持方法重载。)

改用怎么样setFishSize:

希望这可以帮助!

于 2013-11-07T12:45:25.307 回答