2016-08-10 3 views
3

Я создаю игру в комплекте спрайтов с помощью swift, и я пытаюсь перенести SKScene вокруг пальцем, потому что не все узлы поместились внутри сцены. Я уже создал мир, наложения и узлы камеры с помощью этого кода.Перемещение камеры в SpriteKit Swift

 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) 
    } 

Я хотел бы иметь возможность передвигать камеру с помощью жесты панорамирования одним пальцем. Как мне это сделать? Любая помощь будет оценена по достоинству.

ответ

3

В качестве альтернативы решению @ Kris (которое базируется в UIKit) вы также можете отслеживать штрихи в наборе Sprite с вашим подклассом SKScene. Я написал небольшой образец, который должен указать вам в правильном направлении.

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 
    } 
} 

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

+2

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

+0

@ Knight0fDragon Полностью согласен с тем, что UIGestureRecognizers являются более надежными и гибкими, чем «вручную», перехватывая штрихи, переопределяя методы «touchhes». Тем не менее, я хотел продемонстрировать этот путь, потому что он настолько тупо прост в реализации, и это может добавить к взгляду OP на Sprite Kit. – CloakedEddy

+0

О, я полностью понимаю, мой комментарий был просто для других, которые рассматривают это в будущем, им следует сначала попытаться внедрить метод Криса, то есть все – Knight0fDragon

4

Сначала вы должны создать UIPanGestureRecognizer. Затем добавьте его в представление вашей сцены. В вашем методе распознавания жестов вы можете использовать translationInView:. На основании этого вы можете изменить position камеры.

Также при создании распознавателя жестов вы можете настроить количество касаний на maximumNumberOfTouches: и minimumNumberOfTouches:.

0

Если вы обнаружите, что горизонтальное движение противоположно, чем нужное ожидание, попробуйте следующее (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 
} 
Смежные вопросы