我很难设置边界并在平移后在我的视图中正确定位相机。所以这就是我的情景。
我有一个比屏幕大的节点,我想让用户平移以查看完整的地图。当视图为1000 by 1400
时,我的节点为640 by 1136
。地图节点内的精灵具有默认锚点。
然后我将相机添加到地图节点并将其位置设置为(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 :(得分:4)
您的相机实际位于中心右侧0.5点的像素点,距离中心0.5点。在(0,0),您的相机是屏幕的死角。
我认为你所犯的错误是概念性的,认为场景的锚点(0.5,0.5)与场景的中心坐标相同。
如果您正在以像素为单位工作,那么相机位置(500,700)将位于地图的右上角,( - 500,-700)将位于左下角
这假设您正在使用Xcode SpriteKit模板默认的中点锚点。
这意味着您的问题的答案是:在您的地图周围随意移动相机,因为您现在对像素文字的知识充满信心。
有一点需要注意......
许多游戏使用约束来在相机到达地图边缘之前稍微停止相机,这样地图就不会在屏幕上显示半个半关闭。通过这种方式显示地图的边缘,但是相机行进的最远距离足以显示地图的边缘。当你有一个可以走路/移动到边缘的玩家/角色时,这会成为一个基于约束的努力,但是相机并没有完全消失。