Swift - SKCameraNode дрожит при увеличении и перемещении - PullRequest
0 голосов
/ 02 ноября 2018

Я создал 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. Я подумал, что, возможно, они не дают достаточно точное значение, а вместо этого округляют значения положения камеры.

Любые подсказки или указания относительно того, что это может быть, было бы чрезвычайно полезно.

EDIT: Похоже, это проблема при установке 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 () вычислит очень точную позицию, однако, когда я устанавливаю ее равной позиции узла, она внезапно округляется. Это определенно является причиной проблемы. Есть ли способ исправить или обойти это?

...