2017-02-28 98 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