我上的交互式動畫現場工作之後。我希望在場上的所有接觸在進入時被禁用。然後,一旦場景中的對象(它是子類節點)完成旋轉/移動,我想重新啓用屏幕上的所有觸摸以允許交互。我使用此代碼禁用的用戶互動:無法禁用,然後重新啓用觸摸,一個SKAction動畫
override func didMove(to view: SKView) {
setupNodes()
view?.isUserInteractionEnabled = false
spinLocations()
}
這是代碼,場景文件中,對於spinLocations:
func spinLocations() {
var allLocationArrays = [[String : CGPoint]]()
var previousArray = hiddenLocationPositions
for _ in 0...SearchConstant.numSpins {
let freshArray = generateNewLocationArray(previous: previousArray)
allLocationArrays.append(freshArray)
previousArray = freshArray
}
for (item, _) in hiddenLocationPositions {
let node = fgNode.childNode(withName: item) as! LocationNode
node.spin(position: allLocationArrays) // this is function below
}
hiddenLocationPositions = previousArray
}
這是在節點級的動畫代碼:
func spin(position: [[String : CGPoint]]) {
var allActions = [SKAction]()
for array in position {
let action = SKAction.move(to: array[self.name!]!, duration: 2.0)
allActions.append(action)
}
let allActionsSeq = SKAction.sequence(allActions)
self.run(SKAction.sequence([SKAction.wait(forDuration: 5.0), allActionsSeq, SKAction.run {
self.position = position[position.count - 1][self.name!]!
},]))
}
這是觸摸從這個類傳回主場景代碼:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let parent = self.parent else { return }
}
正如你所看到的,觸摸這裏沒有禁用。
我不想在上一個操作之後添加「waitForDuration」SKAction
到runBlock
以更改視圖狀態;我希望程序確定動畫完成執行的時間,然後重新啓用觸摸。
爲了做到這一點,我用理論完成處理可能的工作,但它只是重新啓用觸摸立即(例如處理的處理程序,以旋轉導致要再次檢測到觸摸)。此前,我還嘗試禁用runBlock
中的視圖,但當然,這是即時運行的。我如何確保在不使用「waitForDuration」的情況下在動畫之後重新檢測到觸摸?
所以這段代碼是從另一個類不是一個場景,對不對? – Whirlwind
「didMoveToView」來自現場;旋轉函數來自一個節點類,它將所有的觸摸傳遞迴現場。 – illuminatedtype
是啊,對不起,我是不是準確,我只是爲了詢問旋()方法,因爲它看上去就像是從其他類。我只需要知道您當前的設置,以便爲您編寫一些代碼。我還要問一件事......你說,節點*傳遞給現場。你的意思是,你在該自定義節點上有'userInteractionEnabled = false'? – Whirlwind