如何在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];

我该如何让它发挥作用?

答案很长,这将对您有所帮助。(我受益于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);
}

最新更新