首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在SpriteKit Swift中移动摄像机

在SpriteKit Swift中移动摄像机
EN

Stack Overflow用户
提问于 2016-08-10 14:28:38
回答 4查看 5.3K关注 0票数 7

我正在使用swift在精灵工具包中创建一个游戏,并且我试图能够用手指移动SKScene,因为并不是所有的节点都适合场景。我已经用这段代码创建了world、overlay和camera节点。

代码语言:javascript
复制
        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)
    }

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-10 17:54:58

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

代码语言:javascript
复制
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
  }
}

这不是我写的,只是在操场上写的。还要注意,如果您还想处理其他点击/手势,您将必须编写额外的代码,以确保识别在所有预期的场景中都能很好地工作。

票数 6
EN

Stack Overflow用户

发布于 2018-05-31 19:15:01

如果有人需要它,这里有一个一体化的解决方案:

代码语言:javascript
复制
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
  }

}
票数 9
EN

Stack Overflow用户

发布于 2016-08-10 16:03:07

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38865788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档