我想通过子类将spritenodes生成到屏幕上,但它并没有显示在屏幕上。有人知道我做错了吗?
子类
@implementation Seagull
-(id)init
{
self = [super init];
if (self) {
_atlas = [SKTextureAtlas atlasNamed:@"Seagull"];
_seagull = [SKSpriteNode spriteNodeWithTexture:[_atlas textureNamed:@"Seagull1"]];
_seagull.size = CGSizeMake(156.8, 115.4);
NSArray *flyFrames = @[[_atlas textureNamed:@"Seagull1"],
[_atlas textureNamed:@"Seagull2"]];
_flyAnimation = [SKAction repeatActionForever:[SKAction animateWithTextures:flyFrames timePerFrame:0.15 resize:NO restore:NO]];
[_seagull runAction:_flyAnimation];
}
return self;
}
@end
创建了子类对象
-(Seagull *)spawnSeagull
{
Seagull *seaGull = [[Seagull alloc] init];
seaGull.position = CGPointMake(self.size.width * 0.5, self.size.height * 0.5);
NSLog(@"seagull postion.x = %f && position.y = %f", seaGull.position.x, seaGull.position.y);
[self addChild:seaGull];
return seaGull;
}
添加到viewDidLoad中的场景
[self spawnSeagull];
答案 0 :(得分:1)
在类 SKSpriteNode
(Seagull)中创建属性 SKSpriteNode
(_seagull)时出错。
在init
方法中,您将_seagull
初始化为SKSpriteNode
,但是何时生成海鸥,您只需创建并添加类Seagull
的实例到现场,与实际包含海鸥纹理的_seagull
无关。要解决此问题,您需要在seaGull.seagull
中返回spawnSeagull
,这不是我担心的最佳做法。
但是,您的代码中仍有几个地方需要修复。
在spawnSeagull
:
CGPointMake(self.size.width * 0.5, self.size.height * 0.5)
是错误的,因为你不会以这种方式获得场景的一半大小。[self addChild:seaGull]
,因为您要将其添加到场景中,而不是SKSpriteNode
的子类。在viewDidLoad
(推荐didMoveToView
)中:
spawnSeagull
的返回结果。我在下面添加完整的代码:
删除init
,并在子类中添加一个类方法
+ (Seagull *)spawnSeagull
{
SKTextureAtlas *atlas = [SKTextureAtlas atlasNamed:@"Seagull"];
Seagull *seagull = [Seagull spriteNodeWithTexture:[atlas textureNamed:@"Seagull1"]];
// seagull.size = CGSizeMake(156.8, 115.4);
// May be set scale of seagull is better? like:
seagull.scale = 2.0;
NSArray *flyFrames = @[[atlas textureNamed:@"Seagull1"],
[atlas textureNamed:@"Seagull2"]];
SKAction *flyAnimation = [SKAction repeatActionForever:[SKAction animateWithTextures:flyFrames timePerFrame:0.15 resize:NO restore:NO]];
[seagull runAction:flyAnimation];
return seagull;
}
在 GameScene ,
中调用class方法- (void)didMoveToView:(SKView *)view
{
Seagull *seagull = [Seagull spawnSeagull];
seagull.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
[self addChild:seagull];
}
在this Apple doc中查找更多示例代码,其创建方式shipSprite
将有所帮助。