iPhone文字スライス

文字を三枚にスライスするiPhoneアプリのサンプルコードを描いてみます。

#import “ViewController.h”

@import SpriteKit;

@interface ViewController ()

@property (nonatomic, weak) SKScene *scene;

@property (nonatomic) BOOL ready;

@end

@implementation ViewController

– (void)viewDidLoad {

    [super viewDidLoad];

    

    [self setupScene];

    [self createLetter];

}

– (void)setupScene {

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

    SKScene *scene = [SKScene sceneWithSize:sv.frame.size];

    scene.backgroundColor = [self color:0];

    [sv presentScene:scene];

    [self.view addSubview:sv];

    

    self.scene = scene;

}

– (void)createLetter {

    

    float x = CGRectGetMaxX(self.view.bounds);

    float y = CGRectGetMaxY(self.view.bounds);

    

    SKSpriteNode *mask = [SKSpriteNode spriteNodeWithColor:[self color:0] size:CGSizeMake(x * 0.2, y * 0.2)];

    SKCropNode *crop = [SKCropNode node];

    crop.name = @”cropA”;

    crop.position = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds));

    crop.maskNode = mask;

    [self.scene addChild:crop];

    

    

    SKSpriteNode *back = [SKSpriteNode spriteNodeWithColor:[self color:1] size:CGSizeMake(x, y)];

    [crop addChild:back];

    

    SKLabelNode *label = [SKLabelNode labelNodeWithText:@”Slice”];

    label.name = @”label”;

    label.fontSize = 130;

    label.fontColor = [self color:2];

    [crop addChild:label];

}

– (void)readyLetterSlice {

    

    float x = CGRectGetMaxX(self.view.bounds);

    float y = 50;

    

    SKLabelNode *label = (SKLabelNode *)[self.scene childNodeWithName:@”cropA/label”];

    

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

        CGPoint points[] = {CGPointMake(0, 0),CGPointMake(0, y), CGPointMake(0, 2 * y)};

        

        SKSpriteNode *mask = [SKSpriteNode spriteNodeWithColor:[self color:0] size:CGSizeMake(x, y)];

        mask.position = points[i];

        SKCropNode *crop = [SKCropNode node];

        crop.name = @[@”cropTop”, @”cropMid”, @”cropBottom”][i];

        crop.maskNode = mask;

        crop.position = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds));

        [self.scene addChild:crop];

        

        SKLabelNode *l = [SKLabelNode labelNodeWithText:label.text];

        l.fontColor = label.fontColor;

        l.fontSize = label.fontSize;

        [crop addChild:l];

    }

    

    

    [label removeFromParent];

}

– (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    

    

    SKCropNode *crop = (SKCropNode *)[self.scene childNodeWithName:@”cropA”];

    if (!self.ready) {

        [crop.maskNode runAction:[SKAction sequence:@[

                                                      [SKAction scaleXTo:5.0 duration:0.5],

                                                      [SKAction scaleYTo:5.0 duration:0.5]

                                                      ]] completion:^{

            [self readyLetterSlice];

            self.ready = YES;

        }];

        

    } else {

        

        [self.scene.children[0] runAction:[SKAction rotateByAngle:M_PI * 0.3 duration:2.5]];

        SKCropNode *cropT = (SKCropNode *)[self.scene childNodeWithName:@”cropTop”];

        SKCropNode *cropM = (SKCropNode *)[self.scene childNodeWithName:@”cropMid”];

        SKCropNode *cropB = (SKCropNode *)[self.scene childNodeWithName:@”cropBottom”];

        [cropT runAction:[SKAction moveByX:32 y:0 duration:2.5]];

        [cropM runAction:[SKAction moveByX:-32 y:0 duration:2.5]];

        [cropB runAction:[SKAction moveByX:32 y:0 duration:2.5]];

    }

    

    

}

#define ColorHex(rgb) [UIColor colorWithRed:((rgb & 0xFF0000) >> 16)/255.0 green:((rgb & 0xFF00) >> 8)/255.0 blue:(rgb & 0xFF)/255.0 alpha:1.0]

– (UIColor *)color:(int)i {

    if (i > 4) return nil;

    

    int code[] = {0x10222B, 0x95AB63, 0xBDD684, 0xE2F0D6, 0xF6FFE0};

    return ColorHex(code[i]);

}

@end