如何在手指触摸时移动精灵?

时间:2014-03-21 21:07:12

标签: ios touch sprite-kit

我正在开发一款小游戏来学习更多xcode和Objective-C。

我想在触摸时沿着一个轴移动我的精灵。 我知道如何使用SKAction和moveBy,但精灵在达到规定距离时停止移动。

我希望精灵移动直到触摸结束。目前我只是沿着x轴移动它。

2 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。

这是一个简单的问题:在你的touchesBegan:withEvent:中,在你的场景中设置一个标记为YES,表示手指已经关闭。在touchesEnded:withEvent:中,将标记设置为NO。在您的场景update:方法中,如果标记为YES,请修改精灵的位置。

@implementation MyScene {
    BOOL shouldMoveSprite;
    SKNode *movableSprite;
    NSTimeInterval lastMoveTime;
}

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    lastMoveTime = HUGE_VAL;
    shouldMoveSprite = YES;
}

 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    shouldMoveSprite = NO;
}

 - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    shouldMoveSprite = NO;
}

static CGFloat kSpriteVelocity = 100;

- (void)update:(NSTimeInterval)currentTime {
    NSTImeInterval elapsed = currentTime - lastMoveTime;
    lastMoveTime = currentTime;
    if (elapsed > 0) {
        CGFloat offset = kSpriteVelocity * elapsed;
        CGPoint position = movableSprite.position;
        position.x += offset;
        movableSprite.position = position;
    }
}

另一种方法是,当触摸开始时,将自定义动作(使用+[SKAction customActionWithDuration:block:])附加到稍微移动它的精灵,并在触摸结束时删除动作。

另一种方法是使用物理引擎。触摸开始时,将精灵的physicsBody.velocity设置为非零向量(或应用脉冲)。触摸结束时,将速度设置回CGVectorMake(0,0)

答案 1 :(得分:0)

这就是我所做的 - 不确定它是否是最有效的方法,但它按照我想要的方式工作!

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (self.isFingerOnBowl)
    {
        UITouch *touch = [touches anyObject];
        CGPoint touchLocation = [touch locationInNode:self];
        moveBowlToPoint = [SKAction moveToX:(touchLocation.x) duration:0.01];
        [_bowl runAction:moveBowlToPoint];
    }
}