ios - 平移时正确定位相机

标签 ios swift camera sprite-kit

平移后,我很难在我的视野内设置边界和正确定位相机。所以这是我的场景。

我有一个比屏幕大的节点,我想让用户四处平移以查看完整 map 。当 View 为 640 x 1136 时,我的节点为 1000 x 1400。 map 节点内的 Sprite 具有默认 anchor 。 然后我向 map 节点添加了一个相机并将其位置设置为 (0.5, 0.5)

enter image description here

现在我想知道当用户平移屏幕时是否应该更改相机或 map 节点的位置?第一种方法似乎有问题,因为我不能简单地将平移添加到相机位置,因为位置被定义为 (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 点的像素点。在 (0, 0) 处,您的相机位于屏幕的死点。

我认为你犯的错误是概念上的错误,认为场景的 anchor (0.5, 0.5) 与场景的中心坐标相同。

如果您以像素为单位工作(看起来确实如此),则相机位置 (500, 700) 将位于 map 的右上角,(-500, -700) 将位于 map 的左下角.

这假设您使用的是 Xcode SpriteKit 模板默认的中点 anchor 。

这意味着您的问题的答案是:随心所欲地在 map 周围移动相机,因为您现在确信它是像素文字。

有一个警告...

很多游戏都使用约束在相机到达 map 边缘之前将其停止,这样 map 就不会一半在屏幕上,一半在屏幕上。以这种方式显示 map 的边缘,但相机移动的最远距离仅足以显示 map 的边缘。当您有一个玩家/角色可以走到/移动到边缘,但相机并没有一直走到那里时,这就变成了基于约束的努力。

关于ios - 平移时正确定位相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41827586/

相关文章:

ios - 实体关系中的数据属性更改但不触发 nsfetchresultsController

ios - UITextView 字体反转回系统默认

android - 点击屏幕任意位置拍照的代码

ios - 如何为每个 UITableViewCell 单独单击

javascript - 检测设备颜色

ios - RxSwift+Moya+Moya_ObjectMapper+MJRefresh,刷新失败?

ios - 带有 Pan 手势冲突的 ScrollView 和侧边菜单

opencv - cvCaptureFromCAM()/cvQueryFrame() : disable automatic image correction?

ios - 在 iOS 中检测相机的权限

ios - 当尝试获取 SPTArtist 对象和关联的封面艺术品时,artistWithURI 异常