注射器を押してあそぶ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