[英]Updating SKNodes outside update() of scene
我很驚訝SKScene類中的update方法實際上沒有繼承自SKNode。 對我來說,所有SKNode都能夠進行更新似乎是合乎邏輯的(例如,在不再顯示時將其從場景中刪除)。 我認為這將有助於使實例分離為獨立實體(沒有依賴關系,沒有意外行為)。如果僅在場景中保留更新,還有其他邏輯,請解釋。
所以我想知道是否值得使用計時器(以1/60的時間間隔重復)向我的自定義SKNode添加自定義更新(甚至可能是將其添加到所有SKNode的擴展)。 但是,我想這會占用大量內存。 因此,我想問一下是否有“最佳實踐”。 如果計時器在每個幀處觸發,而不是強制它每秒觸發60次,則可能會起作用。
SpriteKit具有明確定義的更新周期,每種更新(邏輯,物理,圖形)都應在明確定義的時間范圍內進行。
如果您真的想在節點內部編寫更新邏輯,那么最好的解決方案是創建自己的update
方法,然后從GameScene
手動調用它。
讓我們看一個(可能的)結構化方法
protocol Updatable: class {
func update(currentTime: NSTimeInterval)
}
class Player: SKSpriteNode, Updatable {
func update(currentTime: NSTimeInterval) {
// your logic goes here
}
}
class GameScene: SKScene {
private var updatables = [Updatable]()
override func didMoveToView(view: SKView) {
let player = Player()
updatables.append(player)
self.addChild(player)
}
override func update(currentTime: NSTimeInterval) {
updatables.forEach { $0.update(currentTime) }
}
}
如您所見,我正在使用
Updatables
數組。 當將新的Updatables
表添加(或刪除)到場景圖中時,還應注意將新的Updatables
表添加(或刪除)到數組。雖然絕對有可能在每一幀中搜索整個場景圖,但從性能的角度來看這將是非常糟糕的。
我個人不喜歡在我的SKNode
或SKSpriteNode
子類中編寫這種代碼。
我通常創建一個Logic
類。 此類是從GameScene接收update
事件的類。 它還接收其他“邏輯事件”,例如:
gameStarted
touchesBegan
touchesEnded
此類包含游戲的純粹游戲邏輯 。
就像在棋盤游戲中可以找到的《 使用手冊》一樣,它完全與游戲實體的圖形表示無關。
在理想情況下,我將能夠從我的SpriteKit游戲中提取Logic
類,並將其與其他框架甚至同一游戲的(非電子)棋盤游戲版本一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.