TouchesMoved快速落后

时间:2014-09-03 23:36:47

标签: swift sprite-kit

我在SpriteKit中使用Swift在Xcode 6 Beta 6中编写代码。在代码中,当用户移动它时,我需要一个图片来跟随手指。 touchesMoved工作,但有毛刺。如果我慢慢移动手指一切都很好。如果我快速移动手指从右到左,那么一切都很好。如果我快速地从左向右移动手指,那么图片仅跟随手指只持续几分之一秒。如果我轻拍并将图片保持在当前位置大约半秒钟,那么当我从右向左或从左向右快速移动时,一切都很好。总之,我不能快速地从左到右移动图片,除非我点击并按住图片大约半秒钟。任何人都知道为什么会这样?谢谢你的时间。下面是代码。我正在移动SKSPriteNode follow2

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {

    for touch: AnyObject in touches {

        let angle_area_location = touch.locationInNode(self)

        if self.nodeAtPoint(angle_area_location) == self.angle_area {

            if (angle_area_location.x <= 21) {
                angle = 1.55681122463001
                distance12 = sqrt((angle_area_location.y - 30) * (angle_area_location.y - 30) + 1)

            }

            if (angle_area_location.y <= 31) {
                angle = 0.0102037274939542
                distance12 = sqrt((31 - 30) * (31 - 30) + (angle_area_location.x - 20) * (angle_area_location.x - 20))

            }

            if (angle_area_location.x > 21) && (angle_area_location.y > 31) {

                angle = atan((angle_area_location.y - 30) / (angle_area_location.x - 20))
                distance12 = sqrt((angle_area_location.y - 30) * (angle_area_location.y - 30) + (angle_area_location.x - 20) * (angle_area_location.x - 20))

            }

            if (distance12 <= maxFollow2) && (distance12 >= minFollow2) {

                self.cannon.zRotation = angle
                self.arc.zRotation = angle

                if (angle_area_location.x > 21) || (angle_area_location.y > 31) {
                follow2.position = CGPointMake(angle_area_location.x , angle_area_location.y)
                }

                if(angle_area_location.x <= 21) {

                    follow2.position = CGPointMake(21 , angle_area_location.y)

                }

                if (angle_area_location.y <= 31) {

                    follow2.position = CGPointMake(angle_area_location.x , 31)

                }



            }
            if(distance12 > maxFollow2) {

                self.cannon.zRotation = angle
                self.arc.zRotation = angle
                delta = 290/3
                arc.size = CGSizeMake(160 * (1 + delta/20) , 35)
                arc.position = CGPointMake(20 - 3 * (delta) * cos(angle) , 30 - 3 * (delta) * sin(angle))
                followdist = 360
                follow2.position = CGPointMake(angle_area_location.x , angle_area_location.y)
                velocity = vmin + (followdist - minFollow2) * (300/(maxFollow2 - minFollow2))

            }

            if (distance12 < minFollow2) {

                self.cannon.zRotation = angle
                self.arc.zRotation = angle
                arc.size = CGSizeMake(160 , 6.8)
                arc.position = CGPointMake(20 , 30)
                follow2.position = CGPointMake( minFollow2 * cos(angle) + 20 , minFollow2 * sin(angle) + 30)
                followdist = sqrt((follow2.position.y - 30) * (follow2.position.y - 30) + (follow2.position.x - 20) * (follow2.position.x - 20))
                velocity = vmin + (followdist - minFollow2) * (300/(maxFollow2 - minFollow2))


            }

        }

    }


}

2 个答案:

答案 0 :(得分:1)

好的,我想到了故障。我有一个UISwipeGestureRecognizer,当我向右滑动时调用一个方法。我停用了,一切正常。我想在touchsMoved上向右滑动并从左向右移动会相互干扰。

答案 1 :(得分:0)

处理距离时的一个常见技巧是避免取平方根并仅比较平方值。这节省了相当多的处理器资源。

示例:

let maxfollow2sqr = maxFollow2 * maxFollow2

distance12 = (angle_area_location.y - 30) * (angle_area_location.y - 30) + (angle_area_location.x - 20) * (angle_area_location.x - 20)
if (distance12 <= maxFollow2sqr) {
// do something here
}

因为你关心的是如果计算的距离在最小值和最大值之间,你可以只处理方块。这可能会加快功能,但可能还有其他优化措施。