iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
基本的に『Sprite Kit Programming Guide』の内容をサンプルコードに組み込んでみた。
シーンを追加することにする。SKSceneの子クラスSpaceshipSceneを生成する。
前回ラベルを動かすのに呼んだメソッド - runAction: には、終了時に実行するBlocksを渡せる - runAction:completion: というメソッドがあるので、これでSpaceshipSceneシーンを呼び出すようにする。
@implementation MyScene
...
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
SKNode *myLabel = [self childNodeWithName:@"myLabel"]; /* ノードを取得する */
if (myLabel != nil) {
myLabel.name = nil;
SKAction *moveUp = [SKAction moveByX: 0 y: 100.0 duration: 0.5]; /* 上昇 */
SKAction *zoom = [SKAction scaleTo: 2.0 duration: 0.25]; /* 拡大 */
SKAction *pause = [SKAction waitForDuration: 0.5]; /* 停止 */
SKAction *fadeAway = [SKAction fadeOutWithDuration: 0.25]; /* フェードアウト */
SKAction *remove = [SKAction removeFromParent]; /* 消滅 */
SKAction *moveSequence = [SKAction sequence:@[moveUp, zoom, pause, fadeAway, remove]];
[myLabel runAction:moveSequence completion:^{
/* SpaceshipSceneに遷移 */
SKScene *spaceshipScene = [[SpaceshipScene alloc] initWithSize:self.size];
SKTransition *doors = [SKTransition doorsOpenVerticalWithDuration:0.5];
[self.view presentScene:spaceshipScene transition:doors];
}];
}
}
...
@end
SpaceshipSceneの内容は以下の通り。ほぼ、参考資料のままだ。
@interface SpaceshipScene ()
@property (assign, nonatomic) BOOL contentCreated;
@end
@implementation SpaceshipScene
- (void)didMoveToView:(SKView *)view
{
if (!self.contentCreated) {
[self createSceneContents];
self.contentCreated = YES;
}
}
- (void)createSceneContents
{
self.backgroundColor = [SKColor blackColor];
self.scaleMode = SKSceneScaleModeAspectFit;
/* 宇宙船を配置 */
SKSpriteNode *spaceship = [self newSpaceship];
spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) - 150);
[self addChild:spaceship];
}
- (SKSpriteNode *)newSpaceship
{
/* 宇宙船を生成 */
SKSpriteNode *hull = [[SKSpriteNode alloc] initWithColor:[SKColor grayColor] size:CGSizeMake(64,32)];
/* 宇宙船にライトをつける */
SKSpriteNode *light1 = [self newLight];
light1.position = CGPointMake(-28.0, 6.0);
[hull addChild:light1];
/* 宇宙船にライトをつける */
SKSpriteNode *light2 = [self newLight];
light2.position = CGPointMake(28.0, 6.0);
[hull addChild:light2];
/* 宇宙船を動かす */
SKAction *hover = [SKAction sequence:@[
[SKAction waitForDuration:1.0],
[SKAction moveByX:100 y:50.0 duration:1.0],
[SKAction waitForDuration:1.0],
[SKAction moveByX:-100.0 y:-50 duration:1.0]]];
[hull runAction: [SKAction repeatActionForever:hover]];
return hull;
}
- (SKSpriteNode *)newLight
{
/* ライトを生成 */
SKSpriteNode *light = [[SKSpriteNode alloc] initWithColor:[SKColor yellowColor] size:CGSizeMake(8,8)];
/* 点滅させる */
SKAction *blink = [SKAction sequence:@[
[SKAction fadeOutWithDuration:0.25],
[SKAction fadeInWithDuration:0.25]]];
SKAction *blinkForever = [SKAction repeatActionForever:blink];
[light runAction: blinkForever];
return light;
}
@end
『Sprite Kit Programming Guide』では、-(id)initWithSize:(CGSize)sizeを使わないで、contentCreatedプロパティで初回起動の判定しているのは何故だろう?