分度器で狙いをつけて、ABCDEの的に?をぶつけて遊ぶ.といったiPhoneアプリのサンプルコードを描いてみます。
動かすとこんな感じです
サンプルコード
#import “ViewController.h”
#import <SpriteKit/SpriteKit.h>
typedef enum : int8_t {
TypeBox = 0x1 << 1,
TypeWord = 0x1 << 2,
} CollideType;
@interface ProtractorScene : SKScene <SKPhysicsContactDelegate>
@end
@implementation ProtractorScene
– (void)didMoveToView:(SKView *)view
{
[self createSceneContents];
}
– (void)createSceneContents
{
self.physicsWorld.speed = 0.2;
self.physicsWorld.contactDelegate = self;
[self createProtractor];
[self createSlope];
[self createButton];
[self createWords];
}
– (void)createProtractor
{
SKNode *protractor = [SKNode node];
float r = 100;
CGPoint o = CGPointMake(10, 10);
for (int i=0; i<=9; i++) {
float angle = i * (M_PI/18.0);
UIBezierPath *path = [UIBezierPath bezierPath];
float x0 = r*0.9 * cos(angle) + o.x;
float y0 = r*0.9 * sin(angle) + o.y;
float x1 = r * cos(angle) + o.x;
float y1 = r * sin(angle) + o.y;
[path moveToPoint:CGPointMake(x0, y0)];
[path addLineToPoint:CGPointMake(x1, y1)];
SKShapeNode *line = [SKShapeNode node];
line.strokeColor = [SKColor whiteColor];
line.path = path.CGPath;
[protractor addChild:line];
}
NSArray *labels = @[@”90″, @”180″];
for (int i=0; i<2; i++) {
SKLabelNode *l = [SKLabelNode node];
l.text = labels[i];
l.fontSize = 18;
l.position = i ? CGPointMake(o.x + r*1.2, o.y–10) : CGPointMake(o.x + 5, o.y + r*1.1);
[protractor addChild:l];
}
[self addChild:protractor];
}
– (void)createSlope
{
SKColor *color = [[SKColor redColor] colorWithAlphaComponent:0.5];
SKSpriteNode *slope = [SKSpriteNode spriteNodeWithColor:color size:CGSizeMake(120, 5)];
slope.name = @”slope”;
slope.position = CGPointMake(10, 10);
slope.anchorPoint = CGPointMake(0, 0);
[self addChild:slope];
SKAction *up = [SKAction rotateToAngle:M_PI/2.0 duration:2.0];
SKAction *down = [SKAction rotateToAngle:0 duration:2.0];
SKAction *rotate = [SKAction sequence:@[up, down]];
[slope runAction:[SKAction repeatActionForever:rotate]];
}
– (void)createWords
{
NSArray *words = @[@”A”, @”B”, @”C”, @”D”, @”E”];
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(-15, –15, 30, 30)];
for (int i=0; i<words.count; i++) {
SKShapeNode *word = [SKShapeNode node];
word.path = path.CGPath;
word.strokeColor = [SKColor colorWithWhite:0.7 alpha:1.0];
word.fillColor = [SKColor colorWithWhite:0.7 alpha:1.0];
float x = 150 + 70 * i;
float y = 60 + (arc4random() % 180);
word.position = CGPointMake(x, y);
[self addChild:word];
word.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:15];
word.physicsBody.dynamic = NO;
word.physicsBody.categoryBitMask = TypeWord;
word.physicsBody.contactTestBitMask = TypeBox;
SKLabelNode *l = [SKLabelNode node];
l.name = @”label”;
l.position = CGPointMake(0, –10);
l.text = words[i];
l.fontColor = [SKColor colorWithRed:0.8 green:0 blue:0 alpha:1];
[word addChild:l];
}
}
– (void)createButton
{
SKLabelNode *btn = [SKLabelNode node];
btn.name = @”mybutton”;
btn.text = @”+”;
btn.fontColor = [SKColor whiteColor];
btn.fontSize = 60;
btn.position = CGPointMake(CGRectGetMaxX(self.frame) – 30, 10);
[self addChild:btn];
}
– (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
SKNode *btn = [self childNodeWithName:@”mybutton”];
CGPoint p = [[touches anyObject] locationInNode:self];
if ([btn containsPoint:p]) {
[self shoot];
}
}
– (void)shoot
{
SKLabelNode *box = [SKLabelNode node];
box.name = @”box”;
box.text = @”?”;
box.position = CGPointMake(0, 0);
[self addChild:box];
SKNode *slope = [self childNodeWithName:@”slope”];
box.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:20];
box.physicsBody.categoryBitMask = TypeBox;
float dx = cos(slope.zRotation) * 80;
float dy = sin(slope.zRotation) * 80;
[box.physicsBody applyImpulse:CGVectorMake(dx, dy)];
}
– (void)didBeginContact:(SKPhysicsContact *)contact
{
SKNode *box, *word;
if (contact.bodyA.categoryBitMask == TypeWord && contact.bodyB.categoryBitMask == TypeBox ) {
word = contact.bodyA.node;
box = contact.bodyB.node;
} else if (contact.bodyB.categoryBitMask == TypeWord && contact.bodyA.categoryBitMask == TypeBox) {
word = contact.bodyB.node;
box = contact.bodyA.node;
}
SKLabelNode *label = (SKLabelNode*)[word childNodeWithName:@”label”];
[(SKLabelNode*)box setText:label.text];
}
– (void)didSimulatePhysics
{
[self enumerateChildNodesWithName:@”box” usingBlock:^(SKNode *node, BOOL *stop) {
if (node.position.y < 0) {
[node removeFromParent];
}
}];
}
@end
@interface ViewController ()
@end
@implementation ViewController
– (void)viewDidAppear:(BOOL)animated
{
SKView *spriteView = [[SKView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:spriteView];
SKScene *scene = [[ProtractorScene alloc] initWithSize:spriteView.bounds.size];
[spriteView presentScene:scene];
}
@end