【问题标题】:Sprite button and icon hover animationSprite 按钮和图标悬停动画
【发布时间】:2016-03-10 00:50:42
【问题描述】:

我正在尝试在我的自定义按钮 (SKSpriteNodes) 和其他也是 SKSpriteNode 子类的 UI 对象上创建一种效果,以便当鼠标悬停在它们上方时,它们会略微扩展以指示用户将鼠标悬停在它们上方。一旦鼠标离开精灵附近,精灵应该回到正常大小。

我最初使用mouseMoved 方法尝试过此操作,但取消缩放效果被证明是一个问题。有没有更好的方法可以在子类本身中处理这个问题?想法?

【问题讨论】:

    标签: objective-c macos sprite-kit skspritenode mousemove


    【解决方案1】:

    一种方法是简单地跟踪当前悬停的节点(如果有)。像这样。

    我添加了一种递归搜索节点父节点的方法,以尝试找到合适的可悬停父节点。在我的示例中为 SKSpriteNode,但在您的情况下为 Producer,除非我弄错了。

    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
            }
        }
    }
    

    【讨论】:

    • 感谢您的回复。我一直在尝试实现这一点,但我有几个问题。首先,我的 SKSpriteNode 子类对象包含一个 SKShapeNode 作为子对象,mouseMoved 方法正在检测该类而不是该类的类类型(称为Producer)。如果我使用 for 循环来获取该点处属于 Producer 类的所有节点,那么将节点缩放回正常会变得很棘手,因为它仅在 Producer 精灵悬停时才会发生变化。我希望这是有道理的……有什么办法吗?
    猜你喜欢
    • 2023-02-03
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    相关资源
    最近更新 更多