簡體   English   中英

在場景的update()外部更新SKNode

[英]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表添加(或刪除)到數組。

雖然絕對有可能在每一幀中搜索整個場景圖,但從性能的角度來看這將是非常糟糕的。

這是正確的方法嗎?

我個人不喜歡在我的SKNodeSKSpriteNode子類中編寫這種代碼。

我通常創建一個Logic類。 此類是從GameScene接收update事件的類。 它還接收其他“邏輯事件”,例如:

  1. gameStarted
  2. touchesBegan
  3. touchesEnded

此類包含游戲純粹游戲邏輯

就像在棋盤游戲中可以找到的《 使用手冊》一樣,它完全與游戲實體的圖形表示無關。

在理想情況下,我將能夠從我的SpriteKit游戲中提取Logic類,並將其與其他框架甚至同一游戲的(非電子)棋盤游戲版本一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM