2015-05-19 33 views
0

我在SKScene中有一个节点,按照用户的触摸移动。基本上,这个角色也应该试图跟随用户的手指(假设手指在屏幕上)。我现在已经实现了,它工作正常:检测Sprite套件中的长时间触摸

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
    let touch = touches.first as! UITouch 
    player.runAction(SKAction.moveTo(touch.locationInNode(self), duration: 1)) 
} 

override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) { 
    let touch = touches.first as! UITouch 
    player.runAction(SKAction.moveTo(touch.locationInNode(self), duration: 1)) 
} 

override func touchesCancelled(touches: Set<NSObject>!, withEvent event: UIEvent!) { 
    player.removeAllActions() 
} 

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { 
    player.removeAllActions() 
} 

但是,问题是,如果用户握住他/她的手指在手机上。 touchesBegan只被调用一次,那就是当龙头开始的时候,而不是它被保持的时候。我希望玩家角色不断尝试触及手指。

我将相机居中在节点上,所以节点应该只接触手指的唯一时间是用户将手指放在节点上(即与节点相同的位置)。因此,在我运行SKAction来移动节点后,触摸无效,因为它位于旧位置。

我该怎么做?

回答

0

添加两个实例变量到你的SKScene,BOOL fingerIsTouchingCGPoint touchLocation

里面的-touchesBegan:,将fingerIsTouching设置为YES并将touchLocation更新到正确的位置。 在你的SKScene的-update:方法中,检查fingerIsTouching是否为YES,并根据touchLocation移动你的角色。我建议使用-update:,因为它每帧调用一次,这就够了。不过您可能需要使用其他方法来移动字符,而不是SKAction

不要忘记在-touchesMoved:更新touchLocation,并重置fingerIsTouching-touchesCancelled:-touchesEnded: :)

对不起,我的OBJ-C,希望这说明了这一点。

+0

这就是我最终做的事情,虽然我想要的工作多一点,但工作得很好。 – Aaron

3

你可以这样注册的长触摸事件:

let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: "longPressed:") 
self.view.addGestureRecognizer(longPressRecognizer) 

func longPressed(sender: UILongPressGestureRecognizer) { 
    // your code 
} 
+0

我认为这样也可以,但是我遇到了和以前一样的问题。每次手指移动时,手势调用的动作函数只被调用一次。由于我将节点居中并移动到触摸位置,因此触摸当前位置会发生变化。因此,节点会停止跟随手指,因为它认为它已经到达手指位置,但实际上手指的位置刚好由于节点的移动而改变。 – Aaron

+0

我正在寻找的一个好主意是运动如何在Apples SpriteKit示例冒险游戏中起作用。今晚晚些时候我会看看。 – Aaron

1

对于斯威夫特4:

您首先需要做GameScene一个UIGestureRecognizerDelegate

class GameScene: SKScene, UIGestureRecognizerDelegate { 

所以你还需要委托方法添加到GameScene等级:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {   
     return true 
} 

内。然后GameSceneoverride func didMove(to view: SKView) {添加以下内容:

let pressed:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPress(sender:))) 
pressed.delegate = self 
pressed.minimumPressDuration = 0.1 
view.addGestureRecognizer(pressed) 

最后内部GameScene添加函数来处理长按(在其中也可以看出长按的状态太):

func longPress(sender: UILongPressGestureRecognizer) { 

    if sender.state == .began { print("LongPress BEGAN detected") }    
    if sender.state == .ended { print("LongPress ENDED detected") } 

}