iPhoneひげと剣

ヒゲがのった樽に剣をプスプス刺していく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