我正在开发一款小游戏来学习更多xcode和Objective-C。
我想在触摸时沿着一个轴移动我的精灵。 我知道如何使用SKAction和moveBy,但精灵在达到规定距离时停止移动。
我希望精灵移动直到触摸结束。目前我只是沿着x轴移动它。
答案 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];
}
}