缩放和替换节点的最佳方法是什么?

时间:2016-11-20 20:41:34

标签: swift sprite-kit uipinchgesturerecognizer skcameranode

我正在使用Swift 3,SpriteKit和Xcode。

所以我有一个名为backgroundNode的节点,我将游戏的每个节点都附加到这个backgroundNode。

现在我希望能够用捏合手势放大我的游戏,并且当我放大进入游戏中时进行导航。

我认为有两种可能性:

  • 取消放置背景节点并更改其比例以放大和缩小
  • 使用SKCameraNode

您认为最佳选择是什么?

我已经尝试了第一个选项,但缩放手势非常复杂,好像我想要缩放时缩放backgroundNode,锚点在0; 0而不是0.5; 0.5因此它不会缩放捏手势被检测到,但从右下角,我不知道你是否明白我的意思。

对于第二个选项,我无法在没有毛病效果的情况下移动相机,也许我的代码错了但看起来确实是正确的。

你能帮助我吗?

编辑:所以我使用SKCameraNodeUIPanGestureRecognizer开始工作,这是代码:

var cam: SKCameraNode!

let panGesture = UIPanGestureRecognizer()

override func didMove(to view: SKView)
{       
    cam = SKCameraNode()
    camera = cam
    cam.position = CGPoint(x: playableRect.midWidth, y: playableRect.midHeight)
    addChild(cam)

    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(GameScene.panFunction))
    view.addGestureRecognizer(panGesture)
}

func panFunction(pan : UIPanGestureRecognizer)
{
    let deltaX = pan.translation(in: view).x
    let deltaY = pan.translation(in: view).y

    cam.position.x -= deltaX
    cam.position.y += deltaY

    pan.setTranslation(CGPoint(x: 0, y: 0), in: view)
}

现在我正在努力应对Zoom。我尝试使用UIPinchGestureRecognizer,但它的效果不如平移手势,这就是我尝试过的方法:

var firstPinch: CGFloat = 0

var pinchGesture = UIPinchGestureRecognizer()
let panGesture = UIPanGestureRecognizer()
var cam: SKCameraNode!

override func didMove(to view: SKView)
{
    let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(GameScene.pinchFunction))
    view.addGestureRecognizer(pinchGesture)

    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(GameScene.panFunction))
    view.addGestureRecognizer(panGesture)
}

func pinchFunction(pinch : UIPinchGestureRecognizer)
{
    if UIGestureRecognizerState.began == pinch.state
    {
        firstPinch = pinch.scale
    }

    actualPinch = pinch.scale

    cam.xScale -= actualPinch - firstPinch
    cam.yScale -= actualPinch - firstPinch
}

你会怎么做?

1 个答案:

答案 0 :(得分:0)

您需要发布您的代码。我在另一个论坛帮助过这个人。他们的代码+我的答案应该给出一个大致的想法:

https://forums.developer.apple.com/message/192823#192823

基本上它涉及function frequencies(str, wordlist) { return wordlist.reduce(function(counts, word) { counts[word] = (str.match(new RegExp(word, 'g')) || []).length; return counts; }, {}); } console.log(frequencies('foo foo bar foo bar buz', ['foo', 'bar', 'zzz']));等,然后是一些delta-scale逻辑来调整相机的新边界。