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.x–10, p.y–10, 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