適当な画像をぼかして表示する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