iPhoneぷれーん

今日は、プレーンズ見に行ったので、二つのスロットルを操作して、飛行機を操縦するiPhoneアプリのサンプルコードを描いてみます。

今回使った画像


動かすとこんな感じです

サンプルコード

#import “ViewController.h”

#import <SpriteKit/SpriteKit.h>

#define SliderWidth 120

#define SliderHeight 40

@interface SliderNode : SKNode

@property (nonatomic, weak) SKNode *touched;

@property (nonatomic, weak) id target;

@property (nonatomic, assign) SEL selector;

@property int value;

@end

@implementation SliderNode

– (instancetype)initWithTarget:(id)target action:(SEL)action

{

    self = [super init];

    if (self) {

        self.target = target;

        self.selector = action;

        self.userInteractionEnabled = YES;

        [self createSlider];

    }

    return self;

}

– (void)createSlider

{

    SKSpriteNode *bar = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(SliderWidth, 10)];

    [self addChild:bar];

    

    SKSpriteNode *marker = [SKSpriteNode spriteNodeWithColor:[SKColor grayColor] size:CGSizeMake(SliderHeight, SliderHeight)];

    marker.name = @”marker”;

    [self addChild:marker];

}

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

{

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

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

    

    if ([marker containsPoint:p]) {

        self.touched = marker;

    }

}

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

{

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

    

    if (self.touched) {

        float x = p.x;

        float width = SliderWidth/2.0;

        if (p.x > width)

            x = width;

        else if(p.x < – width)

            x = -width;

        self.touched.position = CGPointMake(x, self.touched.position.y);

    

        self.value = (int)x;

    

    if ([self.target respondsToSelector:self.selector])

#pragma clang diagnostic push

#pragma clang diagnostic ignored “-Warc-performSelector-leaks”

        [self.target performSelector:self.selector withObject:self];

#pragma clang diagnostic pop

        

    }

}

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

{

    self.touched = nil;

}

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

{

    self.touched = nil;

}

@end

@interface SliderScene : SKScene

@property (weak, nonatomic) SKNode *selected;

@property float rightEngine;

@property float leftEngine;

@end

@implementation SliderScene

– (void)didMoveToView:(SKView *)view

{

    [self createSceneContents];

}

– (void)createSceneContents

{

    self.backgroundColor = [UIColor colorWithRed:0.85 green:0.85 blue:1.0 alpha:1.0];

    [self createRightAcelerator];

    [self createLeftAcelerator];

    [self createPlane];

}

– (void)createRightAcelerator

{

    SliderNode *slider = [[SliderNode alloc] initWithTarget:self action:@selector(yourFuncion:)];

    slider.name = @”left”;

    slider.position = CGPointMake(100, 120);

    [self addChild:slider];

    slider.zRotation = M_PI / 2.0;

}

– (void)createLeftAcelerator

{

    SliderNode *slider = [[SliderNode alloc] initWithTarget:self action:@selector(yourFuncion:)];

    slider.name = @”right”;

    slider.position = CGPointMake(220, 120);

    [self addChild:slider];

    slider.zRotation = M_PI / 2.0;

}

– (void)createPlane

{

    SKSpriteNode *plane = [SKSpriteNode spriteNodeWithImageNamed:@”plane”];

    plane.name = @”plane”;

    plane.position = CGPointMake(CGRectGetMidX(self.frame), 260);

    [self addChild:plane];

    

    plane.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:plane.size];

    plane.physicsBody.affectedByGravity = NO;

}

– (void)yourFuncion:(SliderNode*)sender

{

    if ([sender.name isEqualToString:@”right”]) {

        self.rightEngine = sender.value / 30.0;

    } else {

        self.leftEngine = sender.value / 30.0;

    }

}

– (void)update:(NSTimeInterval)currentTime

{

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

    float ang = plane.zRotation + M_PI / 2.0;

    

    CGPoint pointRight = [plane convertPoint:CGPointMake(plane.frame.size.width * 0.4, 0) toNode:self];

    CGVector rVec = CGVectorMake(self.rightEngine * cos(ang), self.rightEngine * sin(ang));

    [plane.physicsBody applyForce:rVec atPoint:pointRight];

    

    CGPoint pointLeft = [plane convertPoint:CGPointMake(-plane.frame.size.width * 0.4, 0) toNode:self];

    CGVector lVec = CGVectorMake(self.leftEngine * cos(ang), self.leftEngine * sin(ang));

    [plane.physicsBody applyForce:lVec atPoint:pointLeft];

}

@end

@interface ViewController ()

@end

@implementation ViewController

– (void)viewDidLoad

{

    [super viewDidLoad];

    

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

    [self.view addSubview:spriteView];

    

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

    [spriteView presentScene:scene];

}

– (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end