SpriteKit缩放摄像头

9

我似乎找不到如何在SpriteKit中实现相机的捏合缩放。

在我的GameScene中,我可以使用以下代码对相机进行缩放操作:

let cameraNode = SKCameraNode()

cameraNode.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
addChild(cameraNode)
camera = cameraNode

let zoomInAction = SKAction.scale(to: 0.5, duration: 1)
cameraNode.run(zoomInAction)

但是我似乎无法想出如何将此转换为缩放功能。

1
你需要为你的SKView添加手势来处理缩放,然后将其翻译到场景中。 - Knight0fDragon
你还需要帮助吗? - Fluidity
1个回答

17

这里有一个对我有效的解决方案,使用手势识别器:

class GameScene: SKScene {

  var previousCameraScale = CGFloat()

  override func sceneDidLoad() {
    let pinchGesture = UIPinchGestureRecognizer()
    pinchGesture.addTarget(self, action: #selector(pinchGestureAction(_:)))
    view?.addGestureRecognizer(pinchGesture)
  }

  @objc func pinchGestureAction(_ sender: UIPinchGestureRecognizer) {
    guard let camera = self.camera else {
      return
    }
    if sender.state == .began {
      previousCameraScale = camera.xScale
    }
    camera.setScale(previousCameraScale * 1 / sender.scale)
  }

}

你可以轻松定义相机缩放的最小值和最大值,并在需要时将其用于计算。


这个答案有漏洞。经过几次迭代后,previousCameraScale将会达到无穷大。 - kelin
我从未遇到过这个问题,但正如我所说,我为相机缩放添加了边界,因为我不想允许无限缩放。而且,由于previousCameraScale仅在.began状态下设置,我不知道它如何会变成无穷大... 如果你找到了答案,我会很高兴知道的。 - Steve G.
1
我发现你是正确的。 - kelin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接