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