如何在SpriteKit中旋转并指向光标位置?

时间:2014-11-01 07:54:08

标签: iphone ios7 sprite-kit

我正在使用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 个答案:

答案 0 :(得分: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);
}