iPhone注射

注射器を押してあそぶiPhoneアプリのサンプルコードを描いてみます。

#import “ViewController.h”

#import <SpriteKit/SpriteKit.h>

@interface InjectionScene : SKScene

@property (nonatomic) BOOL push;

@end

@implementation InjectionScene

– (void)didMoveToView:(SKView *)view

{

    self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];

    self.backgroundColor = [SKColor colorWithRed:1 green:1 blue:0.4 alpha:1];

    [self createInjection];

    [self createLiquid];

    [self createPushButton];

}

– (void)createInjection

{

    SKNode *injection = [SKNode node];

    injection.position = CGPointMake(130, 300);

    [self addChild:injection];

    

    CGRect guide[] = {

        CGRectMake(-60, 0, 5, 250),

        CGRectMake(60, 0, 5, 250),

        CGRectMake(-80, –125, 40, 5),

        CGRectMake(80, –125, 40, 5),

        CGRectMake(-40, 125, 40, 5),

        CGRectMake(40, 125, 40, 5),

        CGRectMake(-20, 140, 5, 30),

        CGRectMake(20, 140, 5, 30),

    };

    

    for (int i=0; i<sizeof(guide)/sizeof(CGRect);i++) {

        CGRect r = guide[i];

        SKSpriteNode *g = [SKSpriteNode spriteNodeWithColor:[SKColor lightGrayColor] size:r.size];

        g.position = r.origin;

        [injection addChild:g];

        g.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:g.size];

        g.physicsBody.dynamic = NO;

    }

    

    // piston

    SKSpriteNode *piston = [SKSpriteNode spriteNodeWithColor:[SKColor lightGrayColor] size:CGSizeMake(110, 200)];

    piston.name = @”piston”;

    piston.position = CGPointMake(130, 200);

    [self addChild:piston];

    

    SKSpriteNode *n = [SKSpriteNode spriteNodeWithColor:[SKColor lightGrayColor] size:CGSizeMake(130, 10)];

    n.position = CGPointMake(0, –100);

    [piston addChild:n];

    

    piston.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:piston.size];

    piston.physicsBody.linearDamping = 1.0;

}

– (void)createLiquid

{

    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointZero radius:10 startAngle:0 endAngle:2.0*M_PI clockwise:NO];

    

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

        SKShapeNode *drop = [SKShapeNode node];

        drop.path = path.CGPath;

        drop.lineWidth = 0;

        drop.fillColor = [SKColor greenColor];

        drop.position = CGPointMake(130 + (i%4)*10, 280 + (i/4)*15);

        [self addChild:drop];

        drop.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:10];

    }

}

– (void)createPushButton

{

    SKSpriteNode *button = [SKSpriteNode spriteNodeWithColor:[SKColor greenColor] size:CGSizeMake(180, 60)];

    button.name = @”push button”;

    button.position = CGPointMake(280, 40);

    button.zRotation = M_PI * 0.25;

    [self addChild:button];

    

    SKLabelNode *title = [SKLabelNode node];

    title.text = @”push”;

    title.fontColor = [SKColor whiteColor];

    [button addChild:title];

}

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

{

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

    SKNode *btn = [self childNodeWithName:@”push button”];

    if ([btn containsPoint:p]) {

        self.push = YES;

    }

}

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

{

    self.push = NO;

}

– (void)update:(NSTimeInterval)currentTime

{

    if (self.push) {

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

        [piston.physicsBody applyForce:CGVectorMake(0, 10000)];

    }

}

@end

@interface ViewController ()

@end

@implementation ViewController

– (void)viewDidLoad

{

    [super viewDidLoad];

    

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

    [self.view addSubview:spriteView];

    

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

    [spriteView presentScene:scene];

}

@end