今日は、プレーンズ見に行ったので、二つのスロットルを操作して、飛行機を操縦する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