Ios 拖拽和轻弹/投掷skspritenode

Ios 拖拽和轻弹/投掷skspritenode,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我有球精灵,我想能够弹向其他精灵。现在,我有下面的TouchesMoved功能,但是当我想让我的用户第一次触摸精灵并将他们的手指拖向目标时,它会将我的精灵移动到屏幕上的任何触摸移动。这就是功能失调。。任何帮助都将不胜感激 编辑:我想让球的速度保持不变,不管球的长度如何。。其他答案没有提到 override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) { if firstTim

我有球精灵,我想能够弹向其他精灵。现在,我有下面的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)

    }
覆盖功能触摸移动(触摸:设置,withEvent事件:UIEvent){
如果firstTimerStarted==false{
让touch=touch.first as!UITouch
让touchLocation=touch.locationInNode(自身)
场景触摸(触摸位置)
}

这应该行得通,我刚从一个老项目中挖出来

CGDT用于改变运动的速度/功率

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
        }
    }
}
通过接触点(点A)和精灵的位置(点B),我们可以创建一个角度

atan2是C中非常著名的函数,它创建两点之间的角度。 但是,它的0度是在一个不同的位置比平常

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

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

现在我们使用atan2来计算角度


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

这很有效,非常感谢!不过我刚刚注意到,球的速度取决于手指被拖动的距离,你知道如何使球以相同的速度从短拖动移动到长拖动(恒定速度)吗?回答了你的问题,我试着解释。很好,真的很感激!感谢上帝,它很有效,因为我甚至没有测试它。顺便说一句,我在学校还没有学过几何,但是在网上阅读关于三角和几何的内容将帮助你为SpriteKiti学习一些东西。如果提供的答案有效,你应该接受它(左边的勾号)。请参见此处的答案
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
        }
    }
}