[iOS 7] SpriteKitの物理エンジンを使ってみた -超入門-

iOS 7SpriteKitには物理エンジンが搭載されているようです。
今回は、ちょっとだけそれを使ってみます。

実装

タップしたポイントに赤い四角を表示させ、そのまま重力で落下するサンプルを作ってみます。

#import "CMMyScene.h"

@implementation CMMyScene

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {
        // ここに初期処理
    }
    return self;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint location = [touches.anyObject locationInNode:self];
    [self addRedSquare:location];
}

- (void)addRedSquare:(CGPoint)location
{
    SKSpriteNode *redSquare = [SKSpriteNode spriteNodeWithColor:[SKColor redColor]
                                                           size:CGSizeMake(100.0f, 100.0f)];
    redSquare.position = location;
    redSquare.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:redSquare.size];
    [self addChild:redSquare];
}

@end

はい、簡単でした。
ノードを生成して、physicsBodyに物理エンジンで計算する物体を指定するだけです。

動作確認

では、動かしてみます。

ios7-spritekit-physics-01_01

上の画像では分かりにくいですが、タップしたポイントに赤い四角が表示され落下していきます。

しかし、たくさんタップしていくと、フレームレートがどんどん低下していき動きがカクカクしてきます。

ios7-spritekit-physics-01_02

これは、赤い四角が画面外に落ちていった後もシーン上には存在していて物理シミュレートされており、
数が増えればその分処理も重くなっていくというわけです。

では、直していきます。

修正

#import "CMMyScene.h"

@implementation CMMyScene

-(id)initWithSize:(CGSize)size { if (self = [super initWithSize:size]) { // ここに初期処理 } return self; }

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { CGPoint location = [touches.anyObject locationInNode:self]; [self addRedSquare:location]; }

- (void)addRedSquare:(CGPoint)location { SKSpriteNode *redSquare = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(100.0f, 100.0f)]; redSquare.position = location; redSquare.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:redSquare.size]; redSquare.name = @"redSquare"; [self addChild:redSquare]; }

-(void)didSimulatePhysics { [self enumerateChildNodesWithName:@"redSquare" usingBlock:^(SKNode *node, BOOL *stop) { if (node.position.y < 0) [node removeFromParent]; }]; } @end [/c]

didSimulatePhysicsメソッドを実装することで、
フレームごとの物理シミュレート処理が行われた後に任意の処理をを差し込むことができます。
今回は、赤い四角が画面の下に落下した後に親のシーンから削除しています。これで、フレームレートが低下しなくなります。

簡単ですが、はじめの一歩なので今回はここまで。続きはまた今度。
ではでは。