iOS7で追加されたSpriteKitフレームワークの使い方 ~その1~

お疲れさまです!!

気付くの遅かったけど
SpriteKitっていう新しいフレームワークが追加されてんな…
ゲームを作成するためのフレームワークらしい!
Xcode初心者の僕でも簡単にゲームを作れるらしい!?

吉報ですな。

とりあえず触ってみましょう!!

 

===========================================================

さっと触ってみて思ったことは以下の通りです。

・cocos2dみたいに扱えるやん。
・物理エンジンもついてるやん。
・UIKitみたいに扱えるやん。
・Particleも簡単に使えちゃうじゃん。

===========================================================

 

とりあえずプロジェクト立ち上げて実行!

スクリーンショット 2014-05-05 23.19.43

 

デザインが一際目立つな…
なんかフラットデザインに合ってないような…
とりあえず立ち上げるで!!

 

IMG_1975 IMG_1976

 

ふむ。本当にcocos2dみたいやね…

触ったら戦闘機が永遠に増えていく…

怖い…

 

===========================================================

デフォルトであったファイルはこんなん。

・AppDelegateクラス
・ViewControllerクラス
・MainSceneクラス

===========================================================

 

MainSceneにおもに画面のレイアウトが書いていて
ViewControllerでSpriteKitのView貼っつけてその上に
Sceneとして取得していますね。

 

ViewController.mのviewDidLoadが
画面をロードした後に呼ばれるメソッドなんですが、
そこで見慣れないクラスがちらほら。

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Configure the view.
    SKView * skView = (SKView *)self.view;
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;

    // Create and configure the scene.
    SKScene * scene = [colorBBAMainMyScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;

    // Present the scene.
    [skView presentScene:scene];
}

 

①SKView:SpriteKitのSpriteなどをのせる基礎となるView
②SKScene:ゲーム内にある場面毎に用意する素材。基本的に一つやで。

ちなみにSpriteはゲームに登場する「敵」であったり、
「主人公」であったり、いわゆる背景とは違い、
独立的に動作する絵みたいなイメージです。

 

showFPSとshowNodeCountが右下の数値です。
FPSはFrame Per Second。
要するに1秒に何フレーム?みたいな意味です。
もっと言うとパラパラ漫画みたいな要領です。

 

showNodeCountはそのシーンに対して
何Nodeあるかです。
ちなみに上の画面ではラベルと戦闘機がNodeですな。

 

どちらもYESだから見えるんやー!!

 

次はMainSceneです。

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {
        //ここにシーン表示時したいことを書く。

        //背景色設定
        self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];

        //HelloWorldラベル生成
        SKLabelNode *myLabel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];

        //テキスト、フォントの大きさ、位置を指定。
        myLabel.text = @"Hello, World!";
        myLabel.fontSize = 30;
        myLabel.position = CGPointMake(CGRectGetMidX(self.frame),
                                       CGRectGetMidY(self.frame));

        //自分自身(MainScene)にラベルを追加。(描画)
        [self addChild:myLabel];
    }
    return self;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    //タッチされた際、呼ばれます。

    for (UITouch *touch in touches) {

        //タッチされた位置取得。
        CGPoint location = [touch locationInNode:self];

        //スプライトを生成。
        SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];

        //スプライトのポジションをタッチ位置に指定。
        sprite.position = location;

        //回転するアクション生成
        SKAction *action = [SKAction rotateByAngle:M_PI duration:1];

        //回転アクションを永遠にしてスプライトのアクションに追加。
        [sprite runAction:[SKAction repeatActionForever:action]];

        //自分自身(MainScene)にスプライトを追加。(描画)
        [self addChild:sprite];
    }
}

-(void)update:(CFTimeInterval)currentTime {
    //FPS/1000s毎に呼ばれます。
}

 

ってことで基本的なことはSceneに書けば、
いいんですよね〜。

 

戦闘機がぐるぐると怖いので
少し戦闘機らしい動きをしてもらいましょう!

IMG_1982
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    //タッチされた際、呼ばれます。

    for (UITouch *touch in touches) {

        //タッチされた位置取得。
        CGPoint location = [touch locationInNode:self];

        //スプライトを生成。
        sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];

        //スプライトのポジションをタッチ位置に指定。
        sprite.position = location;

        //自分自身(MainScene)にラベルを追加。
        [self addChild:sprite];

        //ちっちゃくなって
        SKAction *scaleMin = [SKAction scaleTo:0.2f duration:1.0f];

        //飛んでっちゃえーー
        SKAction *up = [SKAction moveToY:900 duration:1.0f];

        //アクションを組み合わす。
        SKAction *seq = [SKAction sequence:@[scaleMin, up]];

        [sprite runAction:seq];
    }
}

これで降下して発進!みたいな感じですね!
うん!怖くなくなった。

 

そしてこの一行を足すだけで仮想的な重力を適用できます!

sprite.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:sprite.frame.size];

是非試して下さい!(挙動は少し変ですが…)

 

今回は簡単に解説をした感じでしたが、
次回はしっかり作成していきまっせー。

コメントを残す

メールアドレスが公開されることはありません。