トップ «前の日記(2014-02-04) 最新 次の日記(2014-02-06)» 編集

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|

2014-02-05 [OSX][iOS]Sprite Kit(その3)

基本的に『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
spiritus

『Sprite Kit Programming Guide』では、-(id)initWithSize:(CGSize)sizeを使わないで、contentCreatedプロパティで初回起動の判定しているのは何故だろう?

_ ソースコード

GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/ios/Spiritus - GitHub

_ 【Cocoa練習帳】

http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

トップ «前の日記(2014-02-04) 最新 次の日記(2014-02-06)» 編集