初始化子类不起作用
Init subclass does not work
我想通过子类生成 spritenode 以进行屏幕显示,但它没有显示在屏幕上。有人知道我做错了什么吗?
子类
@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];
您在 class[=58 中创建 属性 SKSpriteNode
(_seagull) 时出错=] SKSpriteNode
(海鸥)。
在您的 init
方法中,您将 _seagull
初始化为 SKSpriteNode
,但是当生成海鸥时,您所做的只是创建并添加 [=67= 的实例] Seagull
到场景,与 _seagull
无关,实际上包含海鸥的纹理。要解决此问题,您需要在 spawnSeagull
中 return seaGull.seagull
,恐怕这不是最佳做法。
但是,您的代码中仍有几个地方需要修复。
在spawnSeagull
中:
CGPointMake(self.size.width * 0.5, self.size.height * 0.5)
是错误的,因为这样你不会得到场景的一半大小。
- 你应该在 GameScene 中调用
[self addChild:seaGull]
,因为你想将它添加到场景中,而不是 [=] 的子 class 12=].
在viewDidLoad
(推荐didMoveToView
):
- 正如@timgcarlson 评论的那样,您需要一个对象来为其分配
spawnSeagull
的 return 结果。
我在下面添加完整的代码:
去掉init
,在subclass,
中添加一个class方法
+ (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
会有所帮助。
我想通过子类生成 spritenode 以进行屏幕显示,但它没有显示在屏幕上。有人知道我做错了什么吗?
子类
@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];
您在 class[=58 中创建 属性 SKSpriteNode
(_seagull) 时出错=] SKSpriteNode
(海鸥)。
在您的 init
方法中,您将 _seagull
初始化为 SKSpriteNode
,但是当生成海鸥时,您所做的只是创建并添加 [=67= 的实例] Seagull
到场景,与 _seagull
无关,实际上包含海鸥的纹理。要解决此问题,您需要在 spawnSeagull
中 return seaGull.seagull
,恐怕这不是最佳做法。
但是,您的代码中仍有几个地方需要修复。
在spawnSeagull
中:
CGPointMake(self.size.width * 0.5, self.size.height * 0.5)
是错误的,因为这样你不会得到场景的一半大小。- 你应该在 GameScene 中调用
[self addChild:seaGull]
,因为你想将它添加到场景中,而不是 [=] 的子 class 12=].
在viewDidLoad
(推荐didMoveToView
):
- 正如@timgcarlson 评论的那样,您需要一个对象来为其分配
spawnSeagull
的 return 结果。
我在下面添加完整的代码:
去掉init
,在subclass,
+ (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
会有所帮助。