2017-02-28 89 views
1

我有一個類,我想封裝所有的觸摸周圍的邏輯。但是,我也想將觸摸事件傳遞到GameScene,以便我可以刪除其他節點。我認爲super.touchesBegan(touches, withEvent: event)會工作,但沒有骰子。Swift SKSpriteNode類不註冊觸摸到GameScene

我也嘗試了Delegate模式,但我無法讓它工作,也不太喜歡這種方法。

import Foundation 
import SpriteKit 

class LevelSelect: SKSpriteNode { 
    var level:Int = 0 

    init(x: CGFloat, y: CGFloat) { 
     // init code ... 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     // logic affecting this class 
     super.touchesBegan(touches, withEvent: event) 
    } 
} 
+0

您是否試圖讓節點在觸摸時做某些事情,或者您在定位手指位置時遇到問題? – sicvayne

回答

3

SKSpriteNode(super.touches ...)的超類不是SKScene。

此外,當您將觸摸方法添加到SKSpriteNode子類中時,它們只會在觸摸實際節點而不是場景時觸發。它通常用於諸如按鈕子類之類的東西。

如果這就是你想要的,你可以嘗試直接轉發到現場。每個SKSpriteNode有一個可選的場景屬性(零,直到精靈被添加到場景),讓你訪問到現場節點是英寸

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     // logic affecting this class 
     scene?.touchesBegan(touches, withEvent: event) 
} 

你還必須激活您的SKSpriteNode類或觸摸的用戶交互方法不會觸發。

isUserInteractionEnabled = true 

一個更容易的方法是建立在你的LevelSelect類所有你需要做如

class LevelSelect: SKSpriteNode { 
    var level = 0 

    init(x: CGFloat, y: CGFloat) { 
     // init code ... 
    } 

    // Started touches 
    func didStartTouches() { 
     // do something 
    } 
} 

,比你GameScene您可以使用您創建初始化屬性的東西的方法該類並調用方法。

class GameScene: SKScene { 

    levelSelect = LevelSelect(x: ..., y: ...) 

    ... 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
      // logic affecting this class 
      levelSelect.didStartTouches() 
    } 
} 

要直接從SKSpriteNode類(ES)調用一個場景方法,你可以使用「爲」運營商通用的現場物業投放到您的GameScene這樣你就可以調用GameScene如

class LevelSelect: SKSpriteNode { 

    ... 

    func callSomeMethodInGameScene() { 
     let gameScene = scene as? GameScene // dont use as!, always use optionals (as?) when doing the as casting 
     gameScene?.removeAllLabels() 

    } 
} 
方法

希望這會有所幫助

+0

這完全回答了我的問題!謝謝。後續,是否有一種方法可以調用位於該「SKScene」內部的方法?例如,我嘗試了'scene?.removeAllLabels()',並且它沒有訪問權限。 – cdpalmer

+0

另外,我希望我可以再次單獨爲用戶名註冊:D – cdpalmer

+1

嘿,是的,您可以調用方法,您需要將場景屬性投射到您的GameScene中。我更新了我的答案。 – crashoverride777