2017-01-15 8 views
4

다른 노드 간의 일부 상호 작용 개발 중에 노드에서 특정 작업 목록을 제거해야한다는 것을 알게되었습니다. Sprite-Kit 프레임 워크의 현재 버전은 일부 인스턴스 메소드를 제공합니다 : SKNode에서 특정 SKAction 목록 제거

  • removeAllActions()
  • action(forKey key: String)
  • hasActions() 분명히 내 노드에서 실행하는 자사의 식별을위한 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 보정의 효과가, 나는 그것이 적절한 반복 행동의 얼굴에 소개 생각했다. 괴롭히지 않거나 그대로두면 제거해야합니까?
    • 동일한 확장명을 가진 어린이 (예 : )에게이 확장 기능을 확장 (확장)하는 것이 어떻게 가능합니까?
+0

당신이에 속도를 설정하는 것, 그 이유는 무엇입니까? – Confused

+1

'speed = 0'은 필요하지 않습니다. 동작을 제거하면 즉각적이므로 evaluateActions 단계에서 호출되지 않습니다. 또한'forEach'가 0을 처리 할 것이기 때문에'if list.count> 0'도 필요하지 않습니다. – Knight0fDragon

+0

@ Knight0fDragon 좋은 지적입니다. –

답변

1

의견에 동의합니다. 자식 노드에 코드 + 스캔 뭔가처럼 될 수 있도록 아마 speed이 필요하지 않습니다 :

public extension SKNode { 
    func removeAllAction(in list:[String]) { 
     list.forEach { if self.action(forKey: $0) != nil { self.removeAction(forKey: $0)}} 
     self.children 
      .filter { $0.hasActions() } 
      .forEach { $0.removeAllAction(in: list) } 
    } 
}