如果之前有人玩过Agar.io,你可能会熟悉相机移动的方式.它会滑向鼠标,具体取决于鼠标距离屏幕中心的距离.我正在尝试使用SKCameraNode和touchesMoved重新创建此运动:
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let pos = touches.first!.location(in: view)
let center = view!.center
let xDist = pos.x - center.x
let yDist = pos.y - center.y
let distance = sqrt((xDist * xDist) + (yDist * yDist)) * 0.02
camera?.position.x += xDist * distance * 0.02
camera?.position.y -= yDist * distance * 0.02
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,这看起来并不太糟糕.但是,这有两个问题.
首先,我想为此使用UIPanGestureRecognizer,因为它可以通过多次触摸更好地工作.我无法想象如何做到这一点,因为我无法想到一种方法来使用它来获得从触摸到屏幕中心的距离.
第二个问题是这种运动并不顺利.如果用户停止移动他们的手指一帧,那么由于相机拍摄到绝对停止,因此会有巨大的跳跃.我在数学方面很糟糕,所以我想不出一种方法来实现一个很好的平滑衰减(或攻击).
任何帮助都会很棒!
编辑:我现在这样做:
private var difference = CGVector()
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let pos …
Run Code Online (Sandbox Code Playgroud) 这个问题和其他问题讨论了如何使用 SKCameraNode 跟踪 SpriteKit 中的节点。
但是,我们的需求各不相同。
其他解决方案,例如更新update(_ currentTime: CFTimeInterval)
SKScene 中相机的位置,不起作用,因为我们只想在节点将 Y 像素向下移动到屏幕后调整相机位置。
换句话说,如果节点向上移动 10 个像素,相机应该保持静止。如果节点向左或向右移动,相机应保持静止。
我们尝试随着时间的推移而不是立即对摄像机的位置进行动画处理,但是对内部的摄像机运行 SKActionupdate(_ currentTime: CFTimeInterval)
无法执行任何操作。
我的目标是在SKScene
. 在这个场景中,我经常SKCameraNode
根据需要平移。
背景节点必须是静态的,因为它呈现的是远处的天空,预计不会移动。
问题:
如果我只是将背景节点作为子节点添加到场景中,则必须以与相机平移相同的方式移动背景,以便背景在相机视口内始终完全可见。我不想这样做,因为背景节点有一些视觉效果和滤镜应用于它,因此移动它会导致性能下降。
我想要的是将背景作为静态节点或视图布置在背景中,而不必移动它来“跟随”相机。
我尝试过什么:
我知道可以将节点添加为子节点,SKCameraNode
以确保它跟随相机。但正如苹果公司建议的那样,这对于分数标签等 HUD 元素很有用,这些元素通常呈现在所有内容之上。如果您想添加背景,这当然不适用,因为我希望它位于背景中,位于直接作为子节点添加到场景中的节点后面。
尽管如此,我尝试将背景节点作为子节点添加到相机节点并使用 z 位置和类似的东西,但没有任何帮助,正如预期的那样。
我还尝试将背景添加为根的子视图SKView
,但由于某种原因我无法将其渲染在场景后面。
提前致谢。
ios ×3
skcameranode ×3
sprite-kit ×2
sknode ×1
skscene ×1
skspritenode ×1
swift ×1
touchesbegan ×1
touchesmoved ×1