iPhoneおにはそと

節分なので、豆まきっぽくiPhoneアプリのサンプルコードを描いてみます。

使った画像


動かすとこうなります

サンプルコード

#import “ViewController.h”

#import <SpriteKit/SpriteKit.h>

@interface SetsubunScene : SKScene <SKPhysicsContactDelegate>

@property BOOL hit;

@end

@implementation SetsubunScene

-(void)didMoveToView:(SKView *)view

{

    [self createSceneContents];

}

– (void)createSceneContents

{

    self.physicsWorld.contactDelegate = self;

    self.backgroundColor = [UIColor greenColor];

    [self createOni];

    [self createMame];

}

– (void)createOni

{

    SKSpriteNode *oniBody = [SKSpriteNode spriteNodeWithImageNamed:@”onibody”];

    oniBody.name = @”onibody”;

    oniBody.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)+100);

    oniBody.zPosition = 2;

    [self addChild:oniBody];

    

    oniBody.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:30];

    oniBody.physicsBody.categoryBitMask = 0x1 << 1;

    oniBody.physicsBody.contactTestBitMask = 0x1 << 2;

    oniBody.physicsBody.dynamic = NO;

    

    SKSpriteNode *kanabou = [SKSpriteNode spriteNodeWithImageNamed:@”kanabou”];

    kanabou.name = @”kanabou”;

    kanabou.position = CGPointMake(oniBody.position.x+45, oniBody.position.y5);

    kanabou.zPosition = 1;

    kanabou.anchorPoint = CGPointMake(0.1, 0.28);

    [self addChild:kanabou];

    

    SKSpriteNode *hand = [SKSpriteNode spriteNodeWithImageNamed:@”onihand”];

    hand.name = @”hand”;

    hand.position = CGPointMake(oniBody.position.x25, oniBody.position.y);

    hand.zPosition = 1;

    hand.anchorPoint = CGPointMake(0.9, 0.9);

    [self addChild:hand];

}

– (void)createMame

{

    SKSpriteNode *mame = [SKSpriteNode spriteNodeWithImageNamed:@”beans”];

    mame.name = @”mameBox”;

    mame.position = CGPointMake(CGRectGetMidX(self.frame), 100);

    [self addChild:mame];

}

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

{

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

    SKNode *mameBox = [self childNodeWithName:@”mameBox”];

    if ([mameBox containsPoint:p]) {

        UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(-5, –5, 10, 10)];

        SKShapeNode *m = [SKShapeNode node];

        m.name = @”mame”;

        m.path = path.CGPath;

        m.position = p;

        m.fillColor = [SKColor yellowColor];

        [self addChild:m];

        

        m.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:5];

        m.physicsBody.categoryBitMask = 0x1 << 2;

        m.zPosition = 10;

        

        float dx = (arc4random() % 6) – 2.5;

        [m.physicsBody applyForce:CGVectorMake(dx, 160)];

    }

}

– (void)didEndContact:(SKPhysicsContact *)contact

{

    SKNode *oniBody = nil;

    if ([contact.bodyA.node.name isEqualToString:@”onibody”]) {

        oniBody = contact.bodyA.node;

    } else if ([contact.bodyB.node.name isEqualToString:@”onibody”]){

        oniBody = contact.bodyB.node;

    }

    

    if (oniBody && !self.hit) {

        self.hit = YES;

        SKAction *upR = [SKAction rotateToAngle:-M_PI/3.0 duration:2.0];

        SKAction *down = [SKAction rotateToAngle:0 duration:1.0];

        SKAction *handup = [SKAction sequence:@[upR, down]];

        

        SKNode *hand = [self childNodeWithName:@”hand”];

        [hand runAction:handup completion:^{

            self.hit = NO;

        }];

        

        SKAction *upL = [SKAction rotateToAngle:M_PI/3.0 duration:2.0];

        SKAction *kanabouup = [SKAction sequence:@[upL, down]];

        SKNode *kanabou = [self childNodeWithName:@”kanabou”];

        [kanabou runAction:kanabouup];

        

    }

}

– (void)didSimulatePhysics

{

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

        if (node.position.y < 0) {

            [node removeFromParent];

        }

    }];

}

@end

@interface ViewController ()

@end

@implementation ViewController

– (void)viewDidLoad

{

    [super viewDidLoad];

    

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

    [self.view addSubview:spriteView];

    

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

    [spriteView presentScene:scene];

}

@end