iPhone分度器

分度器で狙いをつけて、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.y10) : 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