iPhone バルーン

火ボタンを押すと気球が上にあがっていくiPhoneアプリのサンプルコードを描いてみます。

#import “ViewController.h”

#import <SpriteKit/SpriteKit.h>

@interface BalloonScene : SKScene

@property (nonatomic) BOOL fire;

@end

@implementation BalloonScene

– (void)didMoveToView:(SKView *)view

{

    self.backgroundColor = [SKColor colorWithWhite:0.98 alpha:1];

    

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

    self.physicsWorld.gravity = CGVectorMake(0, –0.1);

    

    [self createBalloon];

    [self createFireButton];

}

– (void)createBalloon

{

    SKNode *balloon = [SKNode node];

    balloon.name = @”balloon”;

    balloon.position = CGPointMake(160, 200);

    [self addChild:balloon];

    

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

    SKShapeNode *circle = [SKShapeNode node];

    circle.position = CGPointMake(0, 80);

    circle.path = pathA.CGPath;

    circle.fillColor = [SKColor greenColor];

    [balloon addChild:circle];

    

    SKSpriteNode *line = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(155, 20)];

    line.position = CGPointMake(0, 80);

    [balloon addChild:line];

    

    UIBezierPath *pathB = [UIBezierPath bezierPath];

    [pathB moveToPoint:CGPointMake(-24, –50)];

    [pathB addLineToPoint:CGPointMake(-82, 80)];

    [pathB addLineToPoint:CGPointMake(82, 80)];

    [pathB addLineToPoint:CGPointMake(24, –50)];

    SKShapeNode *wire = [SKShapeNode node];

    wire.path = pathB.CGPath;

    wire.strokeColor = [SKColor blackColor];

    wire.lineWidth = 3;

    wire.fillColor = [SKColor clearColor];

    [balloon addChild:wire];

    

    SKSpriteNode *basket = [SKSpriteNode spriteNodeWithColor:[SKColor brownColor] size:CGSizeMake(50, 50)];

    basket.position = CGPointMake(0, –80);

    [balloon addChild:basket];

    

    balloon.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(160, 200)];

    balloon.physicsBody.linearDamping = 1.0;

}

– (void)createFireButton

{

    SKSpriteNode *fireBtn = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(60, 60)];

    fireBtn.name = @”fire”;

    fireBtn.position = CGPointMake(270, 50);

    [self addChild:fireBtn];

    

    SKLabelNode *l = [SKLabelNode node];

    l.text = @”;

    l.fontSize = 50;

    l.verticalAlignmentMode = SKLabelVerticalAlignmentModeCenter;

    l.position = CGPointMake(0, 0);

    [fireBtn addChild:l];

}

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

{

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

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

    if ([fire containsPoint:p]) {

        self.fire = YES;

        

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

        

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

        SKShapeNode *f = [SKShapeNode node];

        f.path = path.CGPath;

        f.name = @”fire effect”;

        f.fillColor = [SKColor yellowColor];

        f.lineWidth = 4;

        f.strokeColor = [SKColor redColor];

        f.position = CGPointMake(0, –30);

        [balloon addChild:f];

        

        [f runAction:[SKAction repeatActionForever:[SKAction sequence:@[[SKAction fadeAlphaTo:0.3 duration:0.5], [SKAction fadeAlphaTo:1.0 duration:0.4]]]]];

    }

}

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

{

    if (self.fire) {

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

        SKNode *fire = [balloon childNodeWithName:@”fire effect”];

        [fire removeFromParent];

        self.fire = NO;

    }

}

– (void)update:(NSTimeInterval)currentTime

{

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

    if (self.fire) {

        balloon.physicsBody.velocity = CGVectorMake(0, 10);

    }

}

@end

@interface ViewController ()

@end

@implementation ViewController

– (void)viewDidLoad

{

    [super viewDidLoad];

    

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

    [self.view addSubview:spriteView];

    

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

    [spriteView presentScene:scene];

}

– (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end