ios - 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() 函数将计算一个非常准确的位置,但是当我将它设置为等于节点的位置时,它突然变得四舍五入。这绝对是问题的原因。有没有办法解决或解决这个问题?
解决方案
推荐阅读
- json - 如何使用 jq 从两个日期/时间值计算持续时间
- java - 代号一中的图像到字节数组
- java - 为类的一个实例设置成员变量会覆盖其他类实例的相同成员变量
- javascript - 匹配除 "[[2,3],[2,3],[3,7]]" 以外的任何内容
- arrays - Excel VBA 根据条件将大数组拆分为多个较小的数组
- c# - 对象必须设置为实例(使用 Monogame 的数组)
- arrays - 如何为大于 32 的数组实现 serde::Deserialize?
- jquery - Jquery表单字段验证在Iphone上弹出缺少图标
- c++ - 如果我添加此行,为什么我的程序会不断询问值
- javascript - 在 JavaScript 中调用静态函数时引用类的通用关键字