[英]Is it safe to change `SKNode`s in a gesture recognizer action method?
Apple在https://developer.apple.com/documentation/spritekit/skscenedelegate中說明 :
修改受約束的回調之外的SpriteKit對象(后台隊列或任何其他非主線程)可能導致與並發相關的問題。 即使異步或稍后在主線程上調度工作也存在風險,因為關閉很可能是在SpriteKit期望的時間范圍之外完成的。 如果您遇到SpriteKit框架內部發生的分段錯誤或其他類型的崩潰,那么您的代碼很可能會在正常回調之外修改SpriteKit對象。
我正在使用手勢識別器與我的精靈工具包對象進行交互。 一個簡單的例子是當用戶點擊一個對象時向節點添加一個SKAction:
func tapAction(gr:UITapGestureRecognizer) {
scene.childNode(withName: "balloon")!.run(SKAction.fadeOut(withDuration: 2))
}
盡管這一點“暫時正常”,但我擔心這在更復雜的情況下不起作用。
蘋果有任何暗示這是允許的嗎? 或者我是否真的必須將SpritKit對象的修改從手勢動作推遲到規定的回調?
看起來你很安全,你只是分配一個動作。 這將在正常的精靈套件更新期間運行
如果你正在操縱實際的對象,或刪除一個節點,你會遇到問題。 假設你點擊刪除一個節點。 這個點擊發生在didContactBegin
之前。 didContactBegin
會期望一個節點,但是唉,你刪除它,所以它會崩潰。
如果您對此感到安全,請在更新開始時設置要觸發的隊列。
class GameScene : SKScene
{
public typealias Closure = ()->()
public var processOnUpdate = [Closure]()
override func update(_ currentTime: TimeInterval) {
proceseOnUpdate.forEach{$0()}
processOnUpdate = [Closure]()
....//do other stuff
}
}
//SKView Code
func tapAction(gr:UITapGestureRecognizer) {
scene.processOnUpdate.append(
{
scene.childNode(withName: "balloon")!.run(SKAction.fadeOut(withDuration: 2))
}}
}
我很抱歉,如果這不是第一次運行,我現在不在Mac上測試這個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.