iPhone SKEffectNode

適当な画像をぼかして表示するiPhoneアプリを描いてみます。(SpriteKitのSKEffectNodeのfilterプロパティを試してみたサンプルコードになります。)


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

サンプルコード

#import “ViewController.h”

#import <SpriteKit/SpriteKit.h>

@interface MyEffectScene : SKScene

@property BOOL contentCreated;

@property (strong, nonatomic) SKEffectNode *myEffectNode;

@property (strong, nonatomic) SKLabelNode *label;

@end

@implementation MyEffectScene

@synthesize myEffectNode, label;

– (void)didMoveToView:(SKView *)view

{

    if (!self.contentCreated) {

        [self createSceneContents];

        self.contentCreated = YES;

    }

}

– (void)createSceneContents

{

    

    SKSpriteNode *backImage = [SKSpriteNode spriteNodeWithImageNamed:@”image”];

    backImage.position = CGPointMake(160, 250);

    backImage.blendMode = SKBlendModeAdd;

    

    myEffectNode = [[SKEffectNode alloc] init];

    myEffectNode.filter = [self blurFilter:0];

    myEffectNode.blendMode = SKBlendModeMultiply;

    [self addChild:myEffectNode];

    [myEffectNode addChild:backImage];

    

    label = [[SKLabelNode alloc] init];

    label.text = @”Input Radius = 0″;

    label.position = CGPointMake(160, 20);

    [self addChild:label];

    

    UISlider *slider = [[UISlider alloc] init];

    slider.minimumValue = 0;

    slider.maximumValue = 20;

    slider.center = CGPointMake(160, 400);

    [self.view addSubview:slider];

    [slider addTarget:self action:@selector(changeInputRadius:) forControlEvents:UIControlEventTouchUpInside];

}

– (CIFilter*)blurFilter:(float)num

{

    CIFilter *filter = [CIFilter filterWithName:@”CIGaussianBlur”];

    [filter setDefaults];

    

    [filter setValue:@(num) forKey:@”inputRadius”];

//    

//    Check filter name 

//

//    NSArray *supportedFilters = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];

//    for (CIFilter *filter in supportedFilters) {

//        NSString *string = [NSString stringWithFormat:@”%@”,[[CIFilter filterWithName:(NSString *)filter] inputKeys]];

//        NSLog(@”%@ %@”, filter, string);

//    }

    

    return filter;

}

– (void)changeInputRadius:(UISlider*)sender

{

    label.text = [NSString stringWithFormat:@”input radius = %d”, (int)sender.value];

    myEffectNode.filter = [self blurFilter:sender.value];

}

@end

@interface ViewController ()

@end

@implementation ViewController

– (void)viewDidLoad

{

    [super viewDidLoad];

    

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

    [self.view addSubview:spriteView];

    

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

    [spriteView presentScene:scene];

}

– (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end