2016-08-10 97 views
3

我使用swift在sprite工具包中創建了一個遊戲,我試圖用手指移動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比「手動」通過重寫「觸摸」方法來攔截觸摸更加健壯和靈活。儘管如此,我想以這種方式演示,因爲它的實現非常簡單,並且可能會增加OP對Sprite Kit的看法。 – CloakedEddy

+0

哦,我完全理解,我的評論只是針對未來觀看此內容的其他人,他們應該嘗試首先實施Kris的方法,那就是全部 – Knight0fDragon

4

首先,您必須創建UIPanGestureRecognizer。然後將其添加到您場景的視圖中。在您的手勢識別器的action方法中,您可以使用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 
}