为啥我的精灵没有用图像初始化?

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; 我无法解释为什么它不适合你。也许开始新的、新的项目、最小的课程(见我的帖子)并检查它是否有效。如果它确实继续添加您的自定义代码,并且如果可行,请将其移至您的项目。这里似乎发生了一些“可疑”的事情。 ;)

以上是关于为啥我的精灵没有用图像初始化?的主要内容,如果未能解决你的问题,请参考以下文章

Swift SpriteNode 初始角度

为啥我的布局没有用“adjustPan”向上移动?

SFML从入门到放弃 图像和音频

在 Unity 5 中,为啥精灵表中的某些精灵在精灵中不可见,但在 UI 图像中可以正常工作?

飞机大战

bootstrap轮播 为啥我的轮播没有用