Во время разработки некоторых взаимодействий между разными узлами я понял, что мне нужно удалить определенный список действий из узла. Текущая версия Sprite-Kit
framework предоставляет некоторые методы экземпляра, такие как:
Очевидно, что каждое действие, выполняемое в моем узле, имеет ключ String
для идентификации. Поэтому я подумал о чем-то очень похожем на removeAllAction
, а затем сделал расширение SKNode
:
public extension SKNode {
func removeAllAction(in list:[String]) {
list.forEach { if self.action(forKey: $0) != nil { self.action(forKey: $0)?.speed = 0.0; self.removeAction(forKey: $0)}}
}
}
И в моем проекте я могу использовать его как:
let actionList = ["idle_walk_sx","idle_walk_dx","walk_dx","walk_sx","walk_idle_sx","walk_idle_dx","rotate_sx_dx","rotate_dx_sx"]
self.removeAllAction(in: actionList)
Код работает хорошо. Но я не совсем уверен в двух факторах:
- эффективности
speed
исправлений (до нуля), я счел целесообразным ввести его в условиях повторных действий. Должен ли я удалить его, чтобы избежать странности или оставить его? - Как можно расширить это расширение (расширить его) на любые дочерние элементы, у которых есть один и тот же список для удаления?
speed = 0
не нужен, когда вы удаляете действие, оно выполняется немедленно, поэтому на этапе оценки действий оно не будет вызываться. Кроме того,if list.count > 0
также не нужен, так какforEach
позаботится о счете 0 для вас. - person Knight0fDragon   schedule 16.01.2017