2016-03-10 4 views
0

Я пытаюсь создать эффект над моими пользовательскими кнопками (SKSpriteNodes) и другими объектами пользовательского интерфейса, которые также являются подклассами SKSpriteNode, поэтому, когда мышь нависает над ними, они немного расширяются, указывая на то, что пользователь колеблется над ними. Когда мышь покидает окрестности спрайта, спрайт должен вернуться к нормальному размеру.Sprite button and icon hover animation

Первоначально я попробовал это с помощью метода mouseMoved, но устранение эффекта масштабирования является проблемой. Есть ли лучший способ справиться с этим, возможно, в самих подклассах? Идеи?

ответ

0

Один из способов сделать это - просто отслеживать текущий зависший узел (если есть). Что-то вроде этого.

Я добавил метод рекурсивного поиска родительских узлов, чтобы попытаться найти подходящего родителя-парящего. SKSpriteNode в моем примере, но Продюсер в вашем случае, если я не ошибаюсь.

class GameScene: SKScene { 
    var hoverNode: SKSpriteNode? 

    //Setup 

    override func mouseMoved(theEvent: NSEvent) { 
     let location = theEvent.locationInNode(self) 

     if let node = findHoverable(self.nodeAtPoint(location)) { 
      if (node == hoverNode) { return } 

      node.removeAllActions() 
      node.runAction(SKAction.scaleTo(1.2, duration: 0.5)) 
      hoverNode = node 
     } else { 

      if let hoverNode = hoverNode { 

       hoverNode.removeAllActions() 
       hoverNode.runAction(SKAction.scaleTo(1.0, duration: 0.5)) 
       self.hoverNode = nil 
      } 
     } 
    } 

    private func findHoverable(node: SKNode) -> SKSpriteNode? { 
     if let node = node as? SKSpriteNode { 
      return node 
     } 

     if let parent = node.parent { 
      if let parent = parent as? SKSpriteNode { 
       return parent 
      } else { 
       return findHoverable(parent) 
      } 
     } else { 
      return nil 
     } 
    } 
} 
+0

Спасибо за ответ. Я пытался реализовать это, но у меня есть пара проблем. Во-первых, мой подкласс класса SKSpriteNode содержит SKShapeNode в качестве дочернего элемента, а метод mouseMoved определяет это, а не тип класса (он называется 'Producer') для этого класса. Если я использую цикл for так, чтобы он получал все узлы в этой точке, принадлежащие классу «Продюсер», то это затрудняет масштабирование узла до нормального, поскольку оно изменяется только при наведении спрайта «Продюсер». Надеюсь, это имело смысл ... каким-то образом вокруг этого? – 02fentym