【问题标题】:Correctly position the camera when panning平移时正确定位相机
【发布时间】: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


【解决方案1】:

您的相机实际上位于中心右侧 0.5 点、中心上方 0.5 点的像素点。在 (0, 0) 处,您的相机位于屏幕的死点。

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

如果您以像素为单位工作,看起来就是这样,那么 (500, 700) 的相机位置将位于地图的右上角,( -500, -700 ) 将位于左下角.

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

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

有一个警告......

许多游戏使用约束在相机到达地图边缘之前稍微停止相机,这样地图就不会一半在屏幕上,一半在屏幕上。以这种方式显示地图的边缘,但相机移动的最远仅足以显示地图的边缘。当您有一个可以走到/移动到边缘的玩家/角色,但相机并没有一直走到那里时,这将成为基于约束的工作。

【讨论】:

  • 好答案 困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 2017-03-06
相关资源
最近更新 更多