【问题标题】:Moving Camera in SpriteKit Swift在 SpriteKit Swift 中移动相机
【发布时间】:2016-12-16 09:18:47
【问题描述】:

我正在使用 swift 在 sprite kit 中创建一个游戏,并且我试图能够用手指移动 SKScene,因为并非所有节点都适合场景。我已经用这段代码创建了世界、叠加层和相机节点。

        override func didMoveToView(view: SKView) {
    world = self.childNodeWithName("world")!

    if !isCreated {
        isCreated = true

        // Camera setup
        self.anchorPoint = CGPoint(x: 0.5, y: 0.5)
        self.world = SKNode()
        self.world.name = "world"
        addChild(self.world)

        self.cam = SKNode()
        self.cam.name = "camera"
        self.world.addChild(self.cam)

        // UI setup
        self.overlay = SKNode()
        self.overlay.zPosition = 10
        self.overlay.name = "overlay"
        addChild(self.overlay)
    }

我希望能够通过单指平移手势来移动相机。我该怎么做?任何帮助将不胜感激。

【问题讨论】:

    标签: swift camera sprite-kit skscene pan


    【解决方案1】:

    如果有人需要,这里有一个多合一的解决方案:

    class GameScene: SKScene {
    
      var previousCameraPoint = CGPoint.zero
    
      override func didMove(to view: SKView) {
        let panGesture = UIPanGestureRecognizer()
        panGesture.addTarget(self, action: #selector(panGestureAction(_:)))
        view?.addGestureRecognizer(panGesture)
      }
    
      @objc func panGestureAction(_ sender: UIPanGestureRecognizer) {
        // The camera has a weak reference, so test it
        guard let camera = self.camera else {
          return
        }
        // If the movement just began, save the first camera position
        if sender.state == .began {
          previousCameraPoint = camera.position
        }
        // Perform the translation
        let translation = sender.translation(in: self.view)
        let newPosition = CGPoint(
          x: previousCameraPoint.x + translation.x * -1,
          y: previousCameraPoint.y + translation.y
        )
        camera.position = newPosition
      }
    
    }
    

    【讨论】:

    • 这是最好的答案
    【解决方案2】:

    作为@Kris 的解决方案(基于 UIKit)的替代方案,您还可以使用 SKScene 子类在 Sprite Kit 中监控触摸。我写了一个小样本,应该可以为您指明正确的方向。

    class YourSceneSubclass : SKScene
    {  
      override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        guard let touch = touches.first else {
          return
        }
    
        let location = touch.locationInNode(self)
        let previousLocation = touch.previousLocationInNode(self)
    
        camera?.position.x += location.x - previousLocation.x
        camera?.position.y += location.y - previousLocation.y
      }
    }
    

    我没有运行这个,只是在操场上写的。另请注意,如果您还想处理其他点击/手势,则必须编写额外的代码以确保识别适用于所有预期场景。

    【讨论】:

    • Kris 的解决方案更好,你不能在你的场景中处理多点触控,另外你可以使用 pan 中的其他功能来创建更流畅的动画和过渡
    • @Knight0fDragon 完全同意 UIGestureRecognizer 比通过覆盖 touches 方法来“手动”拦截触摸更加健壮和灵活。尽管如此,我还是想以这种方式进行演示,因为它实现起来非常简单,并且可能会增加 OP 对 Sprite Kit 的看法。
    • 哦,我完全明白了,我的评论只是给以后看到这个的人,他们应该先尝试实现Kris的方法,仅此而已
    • @CloakedEddy 你能解释一下“更健壮和灵活”是什么意思吗?
    • @Knight0fDragon 平底锅中还有哪些其他功能(我假设是手势识别器)可用于创建流畅的动画?
    【解决方案3】:

    首先你必须创建UIPanGestureRecognizer。然后将其添加到您的场景视图中。在手势识别器的action 方法中,您可以使用translationInView:。在此基础上,您可以修改相机的position

    此外,在创建手势识别器时,您可以通过maximumNumberOfTouches:minimumNumberOfTouches: 配置触摸次数。

    【讨论】:

      【解决方案4】:

      如果您发现您的水平运动与您的预期相反,请尝试以下操作 (Swift 3):

      let panGesture = UIPanGestureRecognizer()    
      var previousPoint = CGPoint.zero
      
      func  addPanGesture()
          {
              self.panGesture.addTarget(self, action:#selector(BaseScene.pannedView(_:) ))
              self.panGesture.delegate = self
      
              self.view?.addGestureRecognizer(self.panGesture)
          }
      func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool
      {
          self.previousPoint = self.camera.position
      
          return true
      }
      
      
      func pannedView(_ sender:UIPanGestureRecognizer)
      {
          let transPoint = sender.translation(in: self.view)
      
          let newPosition = self.previousPoint + (CGPoint(x: transPoint.x * -1.0, y: transPoint.y * 1.0))
      
          self.camera.position = newPosition
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-07
        • 1970-01-01
        • 2018-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多