節分なので、豆まきっぽく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.y–5);
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.x–25, 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