Swift-SKCameraNode缩放和移动时会抖动

时间:2018-11-02 04:30:46

标签: ios swift sprite-kit cgfloat

我创建了一个SKCameraNode,它可以移动并查看比例缩放的太阳系。 相机放大并如以下所示移动时出现问题:

https://gfycat.com/HighScarceHorsemouse

这是移动相机位置的代码:

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch: AnyObject in touches{

        let pointOfTouch = touch.location(in: self)
        let previousPointOfTouch = touch.previousLocation(in: self)


        let amountDraggedY = (pointOfTouch.y - previousPointOfTouch.y)
        let amountDraggedX = (pointOfTouch.x - previousPointOfTouch.x)

        hud.touchesMoved(x: amountDraggedX, y: amountDraggedY)

    }
}

hud.touchesMoved称为:

func touchesMoved(x: CGFloat, y:CGFloat){

    print("Previous Position:" + cam.position.debugDescription)
    print("Position Change: (\(x), \(y))")
    cam.position.x = cam.position.x - x
    cam.position.y = cam.position.y - y
    print("New Position: " + cam.position.debugDescription)

}

当相机缩小时,打印功能的输出为我提供了此信息:

Previous Position:(-2940752.25, 86727.8203125)
Position Change: (-2940752.25, -2940752.25)
New Position: (-2940752.25, 86727.8203125)

当相机放大并四处移动时,我得到这些值

Previous Position:(-2940770.0, 86966.34375)
Position Change: (0.0, -0.0859375)
New Position: (-2940770.0, 86966.4296875)

由于某种原因,当我在屏幕上移动手指时,touchesMoved函数没有给出x轴位置变化的值,而是给出了零。一旦我将手指向左或向右移动一定量,它就会捕捉到下一个位置。

我尝试获取视图中触摸的位置(而不是SKScene),然后将其乘以摄影机比例,以获得更精确的数字来移动摄影机。但是由于某种原因,相机的位置一直拒绝移动,直到为其提供足够大的值以使其向左或向右移动为止。

此外,视频仅显示其仅沿x轴抖动。这是地球几乎直接离开太阳的时间。当地球完成其轨道的1/4且在太阳上方时,抖动和运动问题将仅沿y轴发生。这也意味着当相机靠近(0,0)时不会发生抖动。

然后我尝试按比例缩小整个太阳系,因为我认为数量众多是造成此问题的原因。但是它仍然没有解决。然后我尝试使用SKAction来移动相机,但是那也不起作用。

使用CGFloats是否可能是一个问题。我以为他们可能没有给出足够精确的值,而是四舍五入了相机的位置值。

关于这可能是什么的任何线索或指示都会非常有帮助。

编辑: 因此,当将CGPoint设置为等于SKNode的位置时,这似乎是一个问题

 func updatePos(delta:CGFloat, ct:CGFloat){

    let t = CGFloat(Int(ct*10000) % Int(T*10000))/10000
    let newPos = getPos(at: t)

    self.prevPos = self.position
    self.position = newPos
    self.vel = calcVel()

    if(self.name == "Earth"){
        print("P1: " + newPos.debugDescription)
        print("P2: " + self.position.debugDescription)
        //self.position.
    }

}

此打印:

P1: (-147027315091.13248, 4715744568.852638)
P2: (-147027312640.0, 4715744768.0)
P1: (-147027315075.2827, 4715745071.273114)
P2: (-147027312640.0, 4715745280.0)
P1: (-147027315059.33746, 4715745576.7201805)
P2: (-147027312640.0, 4715745792.0)
P1: (-147027315043.39218, 4715746082.167245)
P2: (-147027312640.0, 4715746304.0)
P1: (-147027315027.54242, 4715746584.587657)
P2: (-147027312640.0, 4715746816.0)
P1: (-147027315011.59717, 4715747090.034788)
P2: (-147027312640.0, 4715747328.0)
P1: (-147027314995.65192, 4715747595.481853)
P2: (-147027312640.0, 4715747840.0)

我的calcPos()函数将计算出非常准确的位置,但是当我将其设置为等于节点的位置时,突然之间会四舍五入。这绝对是问题的原因。有没有办法解决或解决这个问题?

0 个答案:

没有答案