ヒゲがのった樽に剣をプスプス刺していくiPhoneアプリのサンプルコードを描いてみます。
#import “ViewController.h”
@import SpriteKit;
@interface HigeScene : SKScene
@property (nonatomic) NSInteger target;
@property (nonatomic, strong) NSMutableArray *btns;
@end
@implementation HigeScene
– (void)didMoveToView:(SKView *)view
{
[self createHige];
[self createBox];
[self startGame];
}
– (void)createHige
{
SKSpriteNode *face = [SKSpriteNode spriteNodeWithColor:[SKColor yellowColor] size:CGSizeMake(80, 80)];
face.name = @”face”;
face.position = CGPointMake(CGRectGetMidX(self.frame), 350);
[self addChild:face];
face.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:face.size];
// hige
SKSpriteNode *r = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(28, 10)];
r.position = CGPointMake(15, –10);
r.zRotation = –0.4;
[face addChild:r];
SKSpriteNode *l = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(28, 10)];
l.position = CGPointMake(-15, –10);
l.zRotation = 0.4;
[face addChild:l];
for (int i=0; i<2; i++) {
SKSpriteNode *eye = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(5, 5)];
eye.position = CGPointMake(i ? 20 : –20, 12);
[face addChild:eye];
}
}
– (void)createBox
{
SKSpriteNode *box = [SKSpriteNode spriteNodeWithColor:[SKColor brownColor] size:CGSizeMake(260, 260)];
box.position = CGPointMake(CGRectGetMidX(self.frame), 180);
[self addChild:box];
box.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:box.size];
box.physicsBody.dynamic = NO;
// button
self.btns = [NSMutableArray array];
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(-40, –30, 80, 60) cornerRadius:2];
for (int i=0; i<9; i++) {
float x = (i % 3) * 80 + 80;
float y = (i / 3) * 80 + 100;
SKShapeNode *btn = [SKShapeNode node];
btn.name = [@(i) stringValue];
btn.position = CGPointMake(x, y);
btn.path = path.CGPath;
btn.fillColor = box.color;
btn.strokeColor = [SKColor darkGrayColor];
[self addChild:btn];
SKSpriteNode *slit = [SKSpriteNode spriteNodeWithColor:[SKColor blackColor] size:CGSizeMake(3, 30)];
slit.position = CGPointMake(-10, 0);
[btn addChild:slit];
SKSpriteNode *fakeCover = [SKSpriteNode spriteNodeWithColor:box.color size:CGSizeMake(28, 30)];
fakeCover.position = CGPointMake(-25, 0);
fakeCover.zPosition = 10;
[btn addChild:fakeCover];
// sword
SKNode *sword = [SKNode node];
sword.name = @”sword”;
sword.position = CGPointMake(10, 0);
[btn addChild:sword];
SKSpriteNode *blade = [SKSpriteNode spriteNodeWithColor:[SKColor colorWithHue:i*0.1 saturation:0.8 brightness:1 alpha:1] size:CGSizeMake(40, 20)];
[sword addChild:blade];
SKSpriteNode *handguard = [SKSpriteNode spriteNodeWithColor:blade.color size:CGSizeMake(8, 40)];
handguard.position = CGPointMake(10, 0);
[sword addChild:handguard];
[self.btns addObject:btn];
}
}
– (void)startGame
{
self.target = arc4random() % 9;
}
– (void)reset
{
[self.btns enumerateObjectsUsingBlock:^(SKNode *btn, NSUInteger idx, BOOL *stop) {
SKNode *sword = [btn childNodeWithName:@”sword”];
[sword runAction:[SKAction moveToX:15 duration:0.1]];
}];
[self startGame];
}
– (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint p = [[touches anyObject] locationInNode:self];
[self.btns enumerateObjectsUsingBlock:^(SKShapeNode *btn, NSUInteger idx, BOOL *stop) {
if ([btn containsPoint:p]) {
SKNode *sword = [btn childNodeWithName:@”sword”];
[sword runAction:[SKAction moveToX:-15 duration:0.3] completion:^{
if ([btn.name intValue] == self.target) {
// clear
SKNode *face = [self childNodeWithName:@”face”];
[face.physicsBody applyImpulse:CGVectorMake(0, 200)];
// reset
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self reset];
});
}
}];
}
}];
}
@end
@interface ViewController ()
@end
@implementation ViewController
– (void)viewDidLoad
{
[super viewDidLoad];
SKView *spriteView = [[SKView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:spriteView];
SKScene *scene = [[HigeScene alloc] initWithSize:spriteView.frame.size];
[spriteView presentScene:scene];
}
@end