本章からは、Sprite Kitに搭載されているゲーム開発のための様々な機能を、もう少し詳しく見ていきます。
まずはスプライト ( SKSpriteNode ) です。 スプライトはテクスチャ画像を画面に表示するためのクラスで、例えば、キャラクタや障害物を表現するために用いることができます。 また、実際のゲームではあまり利用しないかもしれませんが、色を指定して矩形を表示することもできます。
それでは、以下の画像1と矩形を表示してみましょう。
まずは、前章の手順で、SJSprite
プロジェクトを作成します。
そして、SJSpriteScene
を作成し、SKViewに表示させます。
SJSpriteSceneのインスタンスを作成して表示します。
- (void)viewDidLoad
{
/* 省略 */
SKScene *scene = [SJSpriteScene sceneWithSize:self.view.bounds.size];
[skView presentScene:scene];
}
シーンのヘッダファイルは、Sprite Kitをインポートしている以外、特別なところはありません。
#import <SpriteKit/SpriteKit.h>
@interface SJSpriteScene : SKScene
@end
シーンが表示された時に呼ばれるdidMoveToView:
メソッド内で、初期化をしています。
ただし、このメソッドは画面表示の度に呼ばれるため、_contentCreated
フラグによって、一度だけ初期化するようにしています。
#import "SJSpriteScene.h"
@implementation SJSpriteScene {
BOOL _contentCreated;
}
- (void)didMoveToView:(SKView *)view {
if (!_contentCreated) {
[self createSceneContents];
_contentCreated = YES;
}
}
- (void)createSceneContents {
}
@end
この時点で実行すると、もうお馴染みになったFPS等の情報のみの画面が表示されます。
これで準備は整いました。
createSceneContents
の中に、スプライトを表示するコードを書いてみましょう。
sword.png
をプロジェクトに追加するのを忘れないでください。
SKSpriteNode *sword = [SKSpriteNode spriteNodeWithImageNamed:@"sword"];
sword.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
[self addChild:sword];
SKSpriteNode *square = [SKSpriteNode spriteNodeWithColor:[UIColor grayColor] size:CGSizeMake(30.0f, 30.0f)];
square.position = CGPointMake(sword.position.x, sword.position.y - 50.0f);
[self addChild:square];
実行すると、画面の中央に剣が、その少し下にグレーの矩形が表示されています。
なお、Sprite Kitの座標系は左下が原点となります。(iOS・Mac共に)
SKSpriteNodeでは、画像をそのまま表示するだけでなく、色に変化を加えることができます。 以下のコードは赤色を0.2〜1.0の強さでブレンドしています。 例えば、ステータス異常や属性等を表現するのに便利に使える機能でしょう。
for (int i = 1; i <= 5; i++) {
SKSpriteNode *coloredSword = [SKSpriteNode spriteNodeWithImageNamed:@"sword"];
coloredSword.position = CGPointMake(i * 55.0f, square.position.y - 50.0f);
coloredSword.color = [SKColor redColor];
coloredSword.colorBlendFactor = i * 2 / 10.0f;
[self addChild:coloredSword];
}
なお、SKColorは、プラットフォームに応じた色を返してくれるマクロです。(iOSではUIColor、MacだとNSColor)
xScale・yScaleの値を変更すれば、リサイズも簡単にできます。 以下は2倍に拡大する例です。
SKSpriteNode *resizedSword = [SKSpriteNode spriteNodeWithImageNamed:@"sword"];
resizedSword.position = CGPointMake(sword.position.x, sword.position.y + 100.0f);
resizedSword.xScale = 2.0f;
resizedSword.yScale = 2.0f;
[self addChild:resizedSword];
スプライトはAnchor Pointを基準にして表示されます。
デフォルトでは( 0.5, 0.5 )
、つまり中心に設定されており、座標の指定や回転はその点を軸にして行われます。
以下は同じように座標指定、回転をした例ですが、anchorPoint
が一方は中央、もう一方は右下と異なっているため、背景のボックスとの重なり方が異なっています。
なお、zPositionは大きいほど手前に表示されます。
// 基準点中央(左から2番目)
SKSpriteNode *centerSword = [SKSpriteNode spriteNodeWithImageNamed:@"sword"];
centerSword.position = CGPointMake(sword.position.x - 55.0f, resizedSword.position.y + 80.0f);
centerSword.zPosition = 1.0f;
[self addChild:centerSword];
SKSpriteNode *centerBox = [SKSpriteNode spriteNodeWithColor:[UIColor grayColor] size:CGSizeMake(50.0f, 50.0f)];
centerBox.position = centerSword.position;
[self addChild:centerBox];
// 基準点中央・回転(一番左)
SKSpriteNode *centerRotatedSword = [SKSpriteNode spriteNodeWithImageNamed:@"sword"];
centerRotatedSword.position = CGPointMake(centerSword.position.x - 55.0f, centerSword.position.y);
centerRotatedSword.zRotation = 30.0f * M_PI / 180.0f;
centerRotatedSword.zPosition = 1.0f;
[self addChild:centerRotatedSword];
SKSpriteNode *centerRotatedBox = [SKSpriteNode spriteNodeWithColor:[UIColor grayColor] size:CGSizeMake(50.0f, 50.0f)];
centerRotatedBox.position = centerRotatedSword.position;
[self addChild:centerRotatedBox];
// 基準点右下(右から2番目)
SKSpriteNode *bottomSword = [SKSpriteNode spriteNodeWithImageNamed:@"sword"];
bottomSword.position = CGPointMake(sword.position.x + 55.0f, centerRotatedSword.position.y);
bottomSword.zPosition = 1.0f;
bottomSword.anchorPoint = CGPointMake(1.0f, 1.0f);
[self addChild:bottomSword];
SKSpriteNode *bottomBox = [SKSpriteNode spriteNodeWithColor:[UIColor grayColor] size:CGSizeMake(50.0f, 50.0f)];
bottomBox.position = bottomSword.position;
[self addChild:bottomBox];
// 基準点右下・回転(一番右)
SKSpriteNode *bottomRotatedSword = [SKSpriteNode spriteNodeWithImageNamed:@"sword"];
bottomRotatedSword.position = CGPointMake(bottomSword.position.x + 55.0f, bottomSword.position.y);
bottomRotatedSword.zRotation = 30.0f * M_PI / 180.0f;
bottomRotatedSword.zPosition = 1.0f;
bottomRotatedSword.anchorPoint = CGPointMake(1.0f, 1.0f);
[self addChild:bottomRotatedSword];
SKSpriteNode *bottomRotatedBox = [SKSpriteNode spriteNodeWithColor:[UIColor grayColor] size:CGSizeMake(50.0f, 50.0f)];
bottomRotatedBox.position = bottomRotatedSword.position;
[self addChild:bottomRotatedBox];
このようにSKSpriteNodeを使うと、テクスチャ画像を様々な効果と共に、簡単に表示することができます。
画像はBrowserQuest内のものを、CC-BY-SAライセンスにしたがって再利用しています。(そのため、本チュートリアルも同じライセンスとなります。) ↩