为啥我的精灵没有用图像初始化?
Posted
技术标签:
【中文标题】为啥我的精灵没有用图像初始化?【英文标题】:why is my sprite not initializing with the image?为什么我的精灵没有用图像初始化? 【发布时间】:2013-11-06 22:55:57 【问题描述】:我在玩 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];
我做错了什么?
【问题讨论】:
什么是 SmallSize ?我看不出这是在哪里定义的。 前面在 Fish.h 中定义为:static bool left= false; static bool right = true; typedef NS_ENUM(NSInteger, FishSize) SmallSize , MediumSize, LargeSize ;
它是否被用来衡量你的鱼的大小?我觉得我们在这里遗漏了一些重要的代码。您能否发布 Fish.h 和 Fish.m 的完整代码,而不是您认为相关的 sn-ps?
【参考方案1】:
我认为问题很简单。
这是你写的。
- (void) setSize:(FishSize)s;
它会覆盖- (void)setSize:(CGSize)size
。所以大小不会被初始化。
(Objective-C 不支持方法重载。)
改用setFishSize:
怎么样?
希望这会有所帮助!
【讨论】:
是的,这就是问题所在!直盯着我的脸,我看不到 - 真令人沮丧!【参考方案2】:子类化对我来说非常好:
@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 还是 enum 或完全是其他东西?
【讨论】:
不,我指的是 SKSpriteNode 类的 size 属性 - 一旦图像加载到图像的适当大小,就会设置该属性。它被设置为 0,0(这就是我知道发生了什么有趣的事情),而不是实际 SKSpriteNode 对象上的 size 属性,当加载图像时正确显示大小。 Size 为我记录了正确的纹理大小。你确认 fish 不是 nil 吗? 鱼不是零。从字面上看,为了我自己的理智,我把这两行放在一起。我还重写了 spriteNodeWithImageNamed 来调用 super 的方法——它返回一个 0 初始化的大小。所以这两行被一起调用:`SKSpriteNode * node = [SKSpriteNode spriteNodeWithImageNamed:picName]; Fish * fish = [Fish spriteNodeWithImageNamed:picName];` 最后一行声明为+ (id) spriteNodeWithImageNamed : (NSString *) name Fish * f = [super spriteNodeWithImageNamed:name]; return f;
。
我无法解释为什么它不适合你。也许开始新的、新的项目、最小的课程(见我的帖子)并检查它是否有效。如果它确实继续添加您的自定义代码,并且如果可行,请将其移至您的项目。这里似乎发生了一些“可疑”的事情。 ;)以上是关于为啥我的精灵没有用图像初始化?的主要内容,如果未能解决你的问题,请参考以下文章