[我正在SpriteKit中编写一个带有操纵杆来控制玩家的游戏。以前,我将大多数操纵杆逻辑保留在主要GameScene的touchesBegan
,touchesMoved
和touchesEnded
方法中。
由于我有多个SKScenes
,所以我想将此逻辑抽象为一个SKSpriteNode
子类JoyStick
,该子类包含其自己的touches
事件处理程序。这似乎是一个不错的解决方案,因为它可以自动处理触摸是否在操纵杆的“边界”内,并允许我从场景本身中删除逻辑。
但是,我找不到任何好的资源来概述如何正确地在已实现触摸事件处理程序的SKScene
和SKSpriteNode
实例之间来回传递信息。我可以将我想要修改的对象的实例传递给JoyStick(例如播放器精灵),但我很好奇是否存在正确的方式来回传递数据,而无需将操纵杆耦合到特定的“ instance-修改“。
此外,在我的SKSpriteNode实例中实现触摸事件处理程序还有其他缺点,而不是处理场景处理程序中的所有内容?
我喜欢处理对象类中尽可能多的代码。因此,我将处理其类文件中的任何对象触摸代码,并将触摸发送回场景以由场景分别处理。
删除此代码没有任何弊端,还有几个弊端。
清洁代码如果场景的行数较少,则xcode中的加载时间更快(我自己的发现)您不必精确定位触摸所基于的节点,因为它封装在一个子面板中
在子类(猫)中>
protocol CatDelegate: class{ func catTouched(cat: Cat) } class Cat: SKSpriteNode { weak var delegate: CatDelegate! var isEnabled = true var sendTouchesToScene = true var color: SKColor = .white override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent!) { guard isEnabled else { return } //send touch to scene if you need to handle further touches by the scene if sendTouchesToScene { super.touchesBegan(touches, with event) } //handle touches for cat delegate?.catTouched(cat: self) } }
同时在游戏场景中...
class GameScene: SKScene {
private var cat1: Cat!
private var cat2: Cat!
…
func createCats() {
cat1 = Cat()
cat1.color = .magenta
addChild(cat1)
cat2 = Cat()
cat2.color = .green
addChild(cat2)
}
}
extension GameScene: CatDelegate {
func catTouched(cat: Cat) {
print("cat of color \(cat.color)")
}
}