iPhoneろうそく

SpriteKitのSKEmitterNodeを使ってろうそくにリアルな火をともすiPhoneアプリを描いてみます。
(※SKEmitterNodeに指定するsksファイルは、XcodeのFile->new->fileで作成できるSprite Particle Fileというやつで作りました。)


動作イメージ
XcodeからiOS7 iPhone Simulatorで動かすとこんな感じになります。

サンプルコード

#import “ViewController.h”

#import <SpriteKit/SpriteKit.h>

@interface FireScene : SKScene

@property BOOL contentCreated;

@property BOOL candleA;

@property BOOL candleB;

@property BOOL candleC;

@end

@implementation FireScene

– (void)didMoveToView:(SKView *)view

{

    if (!self.contentCreated) {

        [self createSceneContents];

        self.contentCreated = YES;

    }

}

– (void)createSceneContents

{

    SKSpriteNode *backgroundImage = [[SKSpriteNode alloc] initWithImageNamed:@”candles”];

    backgroundImage.position = CGPointMake(160, 200);

    [self addChild:backgroundImage];

    

    NSString *firePath = [[NSBundle mainBundle] pathForResource:@”MyFire” ofType:@”sks”];

    SKEmitterNode *fireEmitter = [NSKeyedUnarchiver unarchiveObjectWithFile:firePath];

    fireEmitter.name = @”firePencil”;

    fireEmitter.particlePosition = CGPointMake(160, 400);

    [self addChild:fireEmitter];

}

– (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

    CGPoint p = [[touches anyObject] locationInNode:self];

    SKEmitterNode *fire = (SKEmitterNode*)[self childNodeWithName:@”firePencil”];

    fire.particlePosition = p;

    

    CGPoint c1 = CGPointMake(55.0, 253.5);

    CGPoint c2 = CGPointMake(140.0, 265.5);

    CGPoint c3 = CGPointMake(240.0, 200.0);

    

    CGPoint candlePoints[] = {c1, c2, c3};

    for (int i=0; i<3; i++) {

        if (CGRectContainsPoint(CGRectMake(p.x10, p.y10, 20, 20), candlePoints[i])) {

            

            switch (i) {

                case 0:

                    if (self.candleA)

                        return;

                    self.candleA = YES;

                    break;

                case 1:

                    if (self.candleB)

                        return;

                    self.candleB = YES;

                    break;

                case 2:

                    if (self.candleC)

                        return;

                    self.candleC = YES;

                    break;

            }

            

            // add fire

            NSString *firePath = [[NSBundle mainBundle] pathForResource:@”MyFire” ofType:@”sks”];

            SKEmitterNode *fireEmitter = [NSKeyedUnarchiver unarchiveObjectWithFile:firePath];

            fireEmitter.particlePosition = p;

            [self addChild:fireEmitter];

            

        }

    }

}

@end

@interface ViewController ()

@end

@implementation ViewController

– (void)viewDidLoad

{

    [super viewDidLoad];

    

    SKView *spriteView = [[SKView alloc] initWithFrame:self.view.bounds];

    [self.view addSubview:spriteView];

    

    SKScene *scene = [[FireScene alloc] initWithSize:self.view.bounds.size];

    [spriteView presentScene:scene];

}

– (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end