iPhoneちょこえっぐ

チョコエッグをくずして中のカプセルを開けるiPhoneアプリのサンプルコードを描いてみます。



使った画像

#import “ViewController.h”

#import <SpriteKit/SpriteKit.h>

@interface EggScene : SKScene

@end

@implementation EggScene

– (void)didMoveToView:(SKView *)view

{

    self.backgroundColor = [SKColor colorWithWhite:0.95 alpha:1];

    [self createCapsule];

    [self createEgg];

}

– (void)createEgg

{

    UIBezierPath *hex = [UIBezierPath bezierPath];

    float r = 200;

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

        if (!i) [hex moveToPoint:CGPointMake(r * cos(0), r * sin(0))];

        else [hex addLineToPoint:CGPointMake(r * cos(i * M_PI/3.0), r * sin(i * M_PI/3.0))];

    }

    

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

        SKCropNode *crop = [SKCropNode node];

        crop.name = @”eggMask”;

        crop.position = CGPointMake(160, 200);

        SKSpriteNode *eggMask = [SKSpriteNode spriteNodeWithImageNamed:@”eggmask”];

        [crop setMaskNode:eggMask];

        [self addChild:crop];

        

        float x = (i % 5) * 3050;

        float y = (i / 5) * 3050;

        SKSpriteNode *hexNode = [SKSpriteNode spriteNodeWithColor:[UIColor brownColor] size:CGSizeMake(40, 40)];

        hexNode.position = CGPointMake(x, y);

        hexNode.zRotation = M_PI/10.0 * (arc4random() % 10);

        [crop addChild:hexNode];

    }

}

– (void)createCapsule

{

    UIBezierPath *roundRect = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(-40, –30, 80, 60) byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:CGSizeMake(10, 10)];

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

        SKShapeNode *node = [SKShapeNode node];

        node.name = i ? @”bottom” : @”top”;

        node.position = CGPointMake(160, i ? 170 : 220);

        node.fillColor = [SKColor greenColor];

        node.path = roundRect.CGPath;

        node.zRotation = i ? 0 : M_PI;

        node.alpha = 0.8;

        [self addChild:node];

    }

}

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

{

    SKSpriteNode *topCap = (SKSpriteNode *)[self childNodeWithName:@”top”];

    __block BOOL clear = YES;

    

    [self enumerateChildNodesWithName:@”eggMask” usingBlock:^(SKNode *node, BOOL *stop) {

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

        SKSpriteNode *eggHex = (SKSpriteNode *)node.children[0];

        if([eggHex containsPoint:p]) {

            

            SKSpriteNode *overlay = [SKSpriteNode spriteNodeWithColor:[SKColor brownColor] size:eggHex.size];

            overlay.position = CGPointMake(eggHex.position.x1, eggHex.position.y1);

            overlay.zRotation = eggHex.zRotation;

            [node addChild:overlay];

            

            eggHex.color = [SKColor whiteColor];

            node.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:eggHex.size];

        }

        

        if ([topCap intersectsNode:eggHex]) {

            clear = NO;

        }

    }];

    

    if (clear) {

        [topCap runAction:[SKAction moveByX:0 y:100 duration:0.3] completion:^{

            SKLabelNode *clear = [SKLabelNode node];

            clear.text = @”clear!”;

            clear.position = CGPointMake(160, 250);

            clear.fontColor = [SKColor orangeColor];

            [self addChild:clear];

            [clear runAction:[SKAction scaleTo:0.1 duration:0] completion:^{

                [clear runAction:[SKAction scaleTo:1.0 duration:0.5]];

            }];

        }];

    }

}

@end

@interface ViewController ()

@end

@implementation ViewController

– (void)viewDidLoad

{

    [super viewDidLoad];

    

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

    [self.view addSubview:spriteView];

    

    SKScene *scene = [[EggScene alloc] initWithSize:spriteView.frame.size];

    [spriteView presentScene:scene];

}

– (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end