如何在声明状态机框架中的状态转换之间设置可逆动画

时间:2016-01-12 19:23:38

标签: qt qml qt5 state-machine qt3d

我想在Qt3D中使用State Machine作为Entity对象,并在其状态之间制作过渡动画。

我了解QML中的两个State Machine框架:

  1. Qt Quick States
  2. The Declarative State Machine Framework
  3. 第一个框架内置在QQuickItem中,它是QtQuick中所有可视项目的基类。因此,这些元素具有状态机的属性,如状态,转换等。由于Entity不继承QQuickItem,我只能使用第二个框架。

    我希望我的实体有两种状态:可见和隐藏。当它具有状态"隐藏"时,实体将缩小为0.如果它可见,它将被放大到1。 这是我目前使用声明状态机框架实现的实体状态:

    import Qt3D 2.0
    import Qt3D.Renderer 2.0
    import QtQml.StateMachine 1.0 as DSM
    
    Entity {
        id: root
    
        property bool show: true
    
        components: [
            Transform {
                id: transform
                Scale { id: scale; scale: 1 }
                Translate { ... }
            }
            Mesh { ... },
            Material { ... },
    
        ]
    
        DSM.StateMachine {
            id: stateMachine
            initialState: visible
            running: true
    
            DSM.State {
                id: visible
                DSM.SignalTransition {
                    targetState: hidden
                    signal: showChanged
                    guard: show == false
                }
                onEntered: scale.scale: 1
            }
    
            DSM.State {
                id: hidden
                DSM.SignalTransition {
                    targetState: visible
                    signal: showChanged
                    guard: show == true
                }
                onEntered: scale.scale: 0
            }
        }
    }
    

    它可以工作,但我想在转换之间添加动画。使用Qt Quick States,我可以像这样使用Transition元素:

    import QtQuick 2.5 as QQ2
    
    Entity {
        ...
        transitions: QQ2.Transition {
                id: tr
                from: "visible"; to: "hidden"; reversible: true
                QQ2.NumberAnimation {
                    target: scale
                    property: "scale"
                    duration: 500
                    from: 1; to: 0
                }
            }
    }
    

    但我无法使用它,因为实体和DSM.StateMachine以及DSM框架的其他部分都不包含transitions属性。

    我只看到快速而肮脏的解决方案 - 为每个州的onEntered插槽添加NumberAnimation元素:

        DSM.State {
            id: visible
            onEntered: QQ2.NumberAnimation {
                target: scale; property: "scale"
                to: 1; duration: 1000
            }
        }
    
        DSM.State {
            id: hidden
            onEntered: QQ2.NumberAnimation {
                target: scale; property: "scale"
                to: 0; duration: 1000
            }
        }
    

    有没有办法使用Transition或其他具有reversible属性的元素或某种方式制作可逆动画而不为每个状态重新定义反向动画?

0 个答案:

没有答案