私はインタラクティブなアニメーションシーンで作業しています。私は入場時に無効にされるシーンのすべてのタッチをしたい。その後、シーン内のオブジェクト(サブクラス化されたノード)が回転/移動を終了すると、画面上のすべてのタッチを再び有効にして相互作用を許可します。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 }
}
ご覧のとおり、ここではタッチは無効になっていません。
runBlock
に「waitForDuration」SKAction
を追加して、前の操作後にビューのステータスを変更したくない場合。私は、アニメーションがいつ実行を終了したのかを判断し、タッチを再び有効にしたいと思っています。
これを実行するには、完了ハンドラを使用して理論化しましたが、ただちに接触を再有効化するだけです(たとえば、ハンドラを回転させて接触を再度検出させるなど)。以前は、runBlock
のビューを無効にしようとしましたが、もちろん、それは即座に実行されます。 「waitForDuration」を使用せずにアニメーションに続いてタッチが再検出されるようにするにはどうすればよいですか?
このコードはシーン以外のクラスのものです – Whirlwind
"didMoveToView"はシーンからのものです。回転関数は、すべてのタッチをシーンに戻すノードクラスからのものです。 – illuminatedtype
ええ、申し訳ありませんが、私は正確ではなかった、私はちょうどそれが他のクラスからのように見えたので、spin()メソッドについて質問するつもりでした。私はちょうどあなたのためにいくつかのコードを書くためにあなたの現在の設定を知る必要があった。私はもっと一つのことを尋ねなければなりません...あなたは、ノードが場面に触れていると言いました。そのカスタムノードに 'userInteractionEnabled = false'がありますか? – Whirlwind