2016-08-10 9 views
3

나는 스피리트를 사용하여 스프라이트 키트로 게임을 만들고 있는데, 모든 노드가 장면 내에 들어 가지 않기 때문에 손가락으로 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 기반) 대신 SKScene 하위 클래스를 사용하여 Sprite Kit에서 터치를 모니터링 할 수도 있습니다. 나는 당신에게 올바른 방향으로 당신을 가르쳐 줄 작은 샘플을 썼다.

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

크리스의 솔루션, 당신은 당신의 시나리오에서 멀티 터치를 처리 할 수 ​​없습니다 더, 당신 플러스 팬의 다른 기능을 사용하여보다 부드러운 애니메이션 및 전환 효과를 만들 수 있습니다. – Knight0fDragon

+0

@ Knight0fDragon UIGestureRecognizers가 'touches' 메서드를 재정 의하여 터치를 "수동으로"가로채는 것보다 강력하고 유연합니다. 그럼에도 불구하고 구현하기가 너무 어리 석기 쉽고 스프라이트 키트에 OP 뷰를 추가 할 수 있으므로이 방법을 보여주고 싶습니다. – CloakedEddy

+0

오, 전 완전히 이해합니다. 내 의견은 앞으로 이것을 보게 될 다른 사람들을위한 것이 었습니다. 먼저 Kris의 방법을 구현해야합니다. 모두 – Knight0fDragon

4

먼저 UIPanGestureRecognizer을 만들어야합니다. 그런 다음 장면 뷰에 추가하십시오. 제스처 인식기의 action 메소드에서 translationInView:을 사용할 수 있습니다. 이를 바탕으로 카메라의 position을 수정할 수 있습니다.

또한 제스처 인식기를 만들 때 maximumNumberOfTouches:minimumNumberOfTouches:으로 터치 횟수를 구성 할 수 있습니다.

0

당신이 당신의 수평 이동이 원하는 기대 이상의 반대는 것을 발견하면, 시도 (스위프트 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 
} 
관련 문제