我有一个比屏幕大的节点,我想让用户平移以查看完整的地图.当视图为640乘1136时,我的节点为1000乘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.0func 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点.在(0,0),您的相机是屏幕的死角.
我认为你所犯的错误是概念性的,认为场景的锚点(0.5,0.5)与场景的中心坐标相同.
如果您正在以像素为单位工作,那么相机位置(500,700)将位于地图的右上角,( – 500,-700)将位于左下方.
这假设您正在使用Xcode SpriteKit模板默认的中点锚点.
这意味着您的问题的答案是:在您的地图周围随意移动相机,因为您现在对像素字面的知识充满信心.
有一点需要注意……
许多游戏使用约束来在相机到达地图边缘之前稍微停止相机,这样地图就不会在屏幕上显示半个半关闭.通过这种方式显示地图的边缘,但是相机行进的最远距离足以显示地图的边缘.当你有一个可以行走/移动到边缘的玩家/角色时,这就变成了基于约束的努力,但是相机并没有完全消失.
总结以上是内存溢出为你收集整理的ios – 平移时正确定位相机全部内容,希望文章能够帮你解决ios – 平移时正确定位相机所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)