Каков наилучший способ масштабирования и перемещения узлов?

Я работаю со Swift 3, SpriteKit и Xcode.

Итак, у меня есть узел с именем backgroundNode, и я присоединяю все узлы моей игры к этому backgroundNode.

Теперь я хотел бы иметь возможность увеличивать масштаб игры с помощью жеста, когда я увеличу масштаб, чтобы перемещаться по моей игре.

Я вижу 2 возможности сделать это:

  • переместите фоновый узел и измените его масштаб, чтобы увеличить или уменьшить масштаб,
  • использовать SKCameraNode

Как вы думаете, это лучший вариант?

Я уже попробовал первый вариант, но жест масштабирования довольно сложен, как будто я масштабирую backgroundNode вверх, когда я хочу увеличить масштаб, точка привязки находится в 0;0, а не в 0,5;0,5, поэтому он не масштабирует там, где обнаружен жест пинча, но в правом нижнем углу я не знаю, понимаете ли вы, что я имею в виду.

И что касается второго варианта, мне не удается переместить камеру, не имея глючного эффекта, возможно, мой код неправильный, но он действительно кажется правильным.

Вы можете мне помочь?

Редактировать: Итак, я получил его с помощью SKCameraNode а также UIPanGestureRecognizerвот код:

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 ответ

Вы должны опубликовать свой код. Я помог кому-то с этим на другом форуме. Их код + мой ответ должны дать общее представление о том, что делать:

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

В основном это включает UIPanGestureRecognizer и т.д., а затем немного логики дельта-масштаба, чтобы приспособиться к новым границам камеры.

Другие вопросы по тегам