iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
最近の流れはプログラマでもUIを他人任せにしないということだろうか。iOS7のUIやのUIKit Dynamics、そして、今回取り上げるSprite Kitから、そんなメッセージを感じた。
Sprite Kitは、2Dゲーム開発をサポートしてくれるフレームワークで、OS標準のフレームワークに含まれていることからゲーム以外にも利用の用途はあると思う。
主なクラスは、描画領域となるSKViewと、ゲームの1画面に対応するSKScene、画面に置かれる要素となるSKNodeとそのサブクラス、画面遷移のアニメーションを担当するSKTransition、ノードの動作を担当するSKActionだ。
今回は、XcodeのiOSのひな形SpriteKit Gameで生成されるプロジェクトの中身を見て行こうと思う。
SpriteKit Gameのひな形から、Spiritusという名前でプロジェクトを作成(GitHubにサンプルコードを用意したので、そちらを参照してほしい)。
ひな形から生成されたプロジェクトでは、SpriteKit.frameworkがリンクされ、以下のようにSpriteKit.hがインポートされているが、最新の開発環境ではLLVM clangのModulesに対応されているので、以下のインポート分を記述するだけで対応できるが、ひな形は以前の最新の記述を採用していないようだ。
@import SpriteKit;
一個だけ生成されたビューコントローラで、画面全体に配置してSKViewに、デバッグ用の情報表示を設定して、シーンを一個追加している。
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Configure the view.
SKView * skView = (SKView *)self.view;
skView.showsFPS = YES; /* frame rateを表示 */
skView.showsNodeCount = YES; /* ノード個数を表示 */
skView.showsDrawCount = YES; /* 描画個数を表示 */
// Create and configure the scene.
SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
// Present the scene.
[skView presentScene:scene];
}
:
@end
つぎに、ひな形から生成されたシーンMySceneの中身を見てみよう。
シーンが開かれたら、中央に『Hello, World!』と記述されたラベルのノードを追加している。
@implementation MyScene
-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {
/* Setup your scene here */
self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];
SKLabelNode *myLabel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
myLabel.text = @"Hello, World!";
myLabel.fontSize = 30;
myLabel.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame));
[self addChild:myLabel];
}
return self;
}
:
@end
そして、このシーンが表示されている画面がタッチされると、宇宙船の画像が貼られた、回転するアクションを追加したノードを追加している。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
/* Called when a touch begins */
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]];
[self addChild:sprite];
}
}
次回は、このサンプルポードをカスタマイズしてみたいと思っている。