2014-11-01 3 views
0

Я работаю с демо-версией Spaceship от SpriteKit, и я хочу, чтобы она вращалась в том месте, где я нажимаю на экран, а затем двигаюсь к нему.Как повернуть и указать местоположение курсора в SpriteKit?

Текущий код, который я только заставляет его двигаться вверх по экрану, начиная с позиции 50,50:

sprite.position = CGPointMake(50,50); 
SKAction *fly = [SKAction moveByX:0.0F y:50.0F duration:1]; 
[sprite runAction:[SKAction repeatActionForever:fly]; 

Как бы я заставить его работать?

ответ

1

Так длинный ответ, это поможет вам. (Я выиграл из книги raywenderlich в)

//Math Utilities 
static inline CGPoint CGPointSubtract(const CGPoint a, 
             const CGPoint b) 
{ 
    return CGPointMake(a.x - b.x, a.y - b.y); 
} 

static inline CGPoint CGPointMultiplyScalar(const CGPoint a, 
              const CGFloat b) 
{ 
    return CGPointMake(a.x * b, a.y * b); 
} 

static inline CGFloat CGPointLength(const CGPoint a) 
{ 
    return sqrtf(a.x * a.x + a.y * a.y); 
} 

static inline CGPoint CGPointNormalize(const CGPoint a) 
{ 
    CGFloat length = CGPointLength(a); 
    return CGPointMake(a.x/length, a.y/length); 
} 

static inline CGPoint CGPointAdd(const CGPoint a, 
           const CGPoint b) 
{ 
    return CGPointMake(a.x + b.x, a.y + b.y); 
} 

static const float SHIP_SPEED = 60.0; 

@implementation yourScene 
{ 
    SKSpriteNode *ship; 
    NSTimeInterval _lastUpdateTime; 
    NSTimeInterval _dt; 
    CGPoint _velocity; 
    CGPoint _lastTouchLocation; 
} 

-(void)didMoveToView:(SKView *)view 
{ 
    ship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"]; 
    ship.position = CGPointMake(50, 50); 
    [self addChild:ship]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchLocation = [touch locationInNode:self.scene]; 
    [self moveShipToward:touchLocation];//Move Toward 
} 

-(void)update:(CFTimeInterval)currentTime { 
    /* Called before each frame is rendered */ 
    { 
     if (_lastUpdateTime) { 
      _dt = currentTime - _lastUpdateTime; 
     } else { 
      _dt = 0; 
     } 
     _lastUpdateTime = currentTime; 

     CGPoint offset = CGPointSubtract(_lastTouchLocation, ship.position); 
     float distance = CGPointLength(offset); 
     if (distance < SHIP_SPEED * _dt) { 
      ship.position = _lastTouchLocation; 
      _velocity = CGPointZero; 
     } else { 
      [self moveSprite:ship velocity:_velocity]; 
      [self rotateSprite:ship toFace:_velocity]; 
     } 
    } 
} 

- (void)moveShipToward:(CGPoint)location 
{ 
    _lastTouchLocation = location; 
    CGPoint offset = CGPointSubtract(location, ship.position); 
    CGPoint direction = CGPointNormalize(offset); 
    _velocity = CGPointMultiplyScalar(direction, SHIP_SPEED); 
} 

- (void)moveSprite:(SKSpriteNode *)sprite 
      velocity:(CGPoint)velocity 
{ 
    CGPoint amountToMove = CGPointMultiplyScalar(velocity, _dt); 
    sprite.position = CGPointAdd(sprite.position, amountToMove); 
} 

- (void)rotateSprite:(SKSpriteNode *)sprite 
       toFace:(CGPoint)direction 
{ 
    sprite.zRotation = atan2f(direction.y, direction.x); 
} 
Смежные вопросы