【发布时间】:2017-01-24 11:53:00
【问题描述】:
平移后,我很难在视图内设置边界和正确定位相机。所以这是我的场景。
我有一个比屏幕大的节点,我想让用户四处移动以查看完整的地图。当视图为640 by 1136 时,我的节点为1000 by 1400。地图节点内的精灵具有默认锚点。
然后我在地图节点中添加了一个摄像头并将其位置设置为(0.5, 0.5)。
现在我想知道当用户平移屏幕时是否应该更改相机或地图节点的位置?第一种方法似乎有问题,因为我不能简单地将平移添加到相机位置,因为位置定义为 (0.5, 0.5) 并且平移值远大于此。所以我尝试将它乘以/除以屏幕尺寸,但这似乎不起作用。第二种方法更好吗?
var map = Map(size: CGSize(width: 1000, height: 1400))
override func didMove(to view: SKView) {
(...)
let pan = UIPanGestureRecognizer(target: self, action: #selector(panned(sender:)))
view.addGestureRecognizer(pan)
self.anchorPoint = CGPoint.zero
self.cam = SKCameraNode()
self.cam.name = "camera"
self.camera = cam
self.addChild(map)
self.map.addChild(self.cam!)
cam.position = CGPoint(x: 0.5, y: 0.5)
}
var previousTranslateX:CGFloat = 0.0
func panned (sender:UIPanGestureRecognizer) {
let currentTranslateX = sender.translation(in: view!).x
//calculate translation since last measurement
let translateX = currentTranslateX - previousTranslateX
let xMargin = (map.nodeSize.width - self.frame.width)/2
var newCamPosition = CGPoint(x: cam.position.x, y: cam.position.y)
let newPositionX = cam.position.x*self.frame.width + translateX
// since the camera x is 320, our limits are 140 and 460 ?
if newPositionX > self.frame.width/2 - xMargin && newPositionX < self.frame.width - xMargin {
newCamPosition.x = newPositionX/self.frame.width
}
centerCameraOnPoint(point: newCamPosition)
//(re-)set previous measurement
if sender.state == .ended {
previousTranslateX = 0
} else {
previousTranslateX = currentTranslateX
}
}
func centerCameraOnPoint(point: CGPoint) {
if cam != nil {
cam.position = point
}
}
【问题讨论】:
-
您从哪里获得相机的 (0.5, 0.5) 位置?
-
等等..我想我明白你做了什么......你是从 Xcode 的默认模板开始的吗?并且没有改变场景的锚点?
-
我将锚点(您可以这样定义)与相机位置混合在一起。因为在这种情况下,它距离中心 0.5 个像素。我在
didLoad中将场景的锚点设置为0.0。否则没有碰过它们。 -
锚点指向
(0.0, 0.0)?如果是这样,那就是左下角,所以我在下面的答案,将编号更改为左下角的基本思想而不是笛卡尔坐标。其余的仍然适用。 -
这是我经常犯的那种错误,会感到困惑、茫然,然后……
标签: ios swift camera sprite-kit