
チョコエッグをくずして中のカプセルを開ける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) * 30 – 50;
float y = (i / 5) * 30 – 50;
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.x – 1, eggHex.position.y – 1);
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