拖动并轻弹/抛出skspritenode

时间:2015-06-04 05:42:40

标签: ios swift sprite-kit

我有球精灵,我希望能够轻弹其他精灵。现在,我有下面的功能TouchesMoved,但它会将我的精灵移动到屏幕上的任何触摸移动,当我希望我的用户首先触摸精灵并将他们的手指拖向目标时,导致精灵移动。这是功能失调的功能..任何帮助将不胜感激!

编辑:我希望无论弹跳长度如何,球速都保持不变。其他答案无法解决。

    override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {

    if firstTimerStarted == false {
        let touch = touches.first as! UITouch
        let touchLocation = touch.locationInNode(self)
        sceneTouched(touchLocation)

    }

1 个答案:

答案 0 :(得分:2)

这应该有用,我只是从一个旧项目挖出来的。

CGFloat dt用于改变运动的速度/力量。

var touching = false

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    let touch = touches.first as! UITouch
    let location = touch.locationInNode(self)
    if sprite.frame.contains(location) {
        touchPoint = location
        touching = true
    }
}
override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {

    let touch = touches.first as! UITouch
    let location = touch.locationInNode(self)
    touchPoint = location
}
override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
    touching = false
}
override func update(currentTime: CFTimeInterval) {
    if touching {
        if touchPoint != sprite.position
        {
            let dt:CGFloat = 0.15
            let distance = CGVector(dx: touchPoint.x-sprite.position.x, dy: touchPoint.y-sprite.position.y)
            let vel = CGVector(dx: distance.dx/dt, dy: distance.dy/dt)
            sprite.physicsBody!.velocity = vel
        }
    }
}

编辑: 它距离越远越强的原因是因为矢量是精灵和触摸点之间的距离。 尝试将其作为更新功能弹出。它应该工作......

override func update(currentTime: CFTimeInterval) {
    if touching {
        if touchPoint != sprite.position
        {
            let pointA = touchPoint
            let pointB = sprite.position
            let pointC = CGPointMake(sprite.position.x + 2, sprite.position.y)
            let angle_ab = atan2(pointA.y - pointB.y, pointA.x - pointB.x)
            let angle_cb = atan2(pointC.y - pointB.y, pointC.x - pointB.x)
            let angle_abc = angle_ab - angle_cb
            let vectorx = cos(angle_abc)
            let vectory = sin(angle_abc)
            let dt:CGFloat = 15
            let vel = CGVector(dx: vectorx * dt, dy: vectory * dt)
            sprite.physicsBody!.velocity = vel
        }
    }
}

使用touchPoint(pointA)和精灵的位置(pointB),我们可以创建一个角度。

atan2,是一个非常着名的C函数,它创建了两点之间的角度。 但是,它的0度与平时不同。

所以,我们需要自己的0度标记,我使用该点的中间右边作为我的标记。 这是常见的0度位置:

http://www.cs.ucsb.edu/~pconrad/images/math/unitCircleWithDegrees.png

因为它位于精灵位置的右侧,所以我们在精灵的右边创建一个点(pointC)。

我们现在使用atan2来找到角度。

要从角度创建矢量,我们只使用cos和sin作为x和y值。