Каков наилучший способ масштабирования и перемещения узлов?
Я работаю со 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
и т.д., а затем немного логики дельта-масштаба, чтобы приспособиться к новым границам камеры.