首页 > 解决方案 > Swift - SKCameraNode 在缩放和移动时抖动

问题描述

我创建了一个 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() 函数将计算一个非常准确的位置,但是当我将它设置为等于节点的位置时,它突然变得四舍五入。这绝对是问题的原因。有没有办法解决或解决这个问题?

标签: iosswiftsprite-kitcgfloat

解决方案


推荐阅读