| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the documentation of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:FDL$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU Free Documentation License Usage |
| ** Alternatively, this file may be used under the terms of the GNU Free |
| ** Documentation License version 1.3 as published by the Free Software |
| ** Foundation and appearing in the file included in the packaging of |
| ** this file. Please review the following information to ensure |
| ** the GNU Free Documentation License version 1.3 requirements |
| ** will be met: https://www.gnu.org/licenses/fdl-1.3.html. |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| /*! |
| \example animation/stickman |
| \title Stickman Example |
| |
| \brief The Stickman example shows how to animate transitions in a state |
| machine to implement key frame animations. |
| |
| \image stickman-example.png |
| |
| In this example, we will write a small application which animates the joints in a skeleton and |
| projects a stickman figure on top. The stickman can be either "alive" or "dead", and when in the |
| "alive" state, he can be performing different actions defined by key frame animations. |
| |
| Animations are implemented as composite states. Each child state of the animation state |
| represents a frame in the animation by setting the position of each joint in the stickman's |
| skeleton to the positions defined for the particular frame. The frames are then bound together |
| with animated transitions that trigger on the source state's propertiesAssigned() signal. Thus, |
| the machine will enter the state representing the next frame in the animation immediately after |
| it has finished animating into the previous frame. |
| |
| \image stickman-example1.png |
| |
| The states for an animation is constructed by reading a custom animation file format and |
| creating states that assign values to the "position" properties of each of the nodes in the |
| skeleton graph. |
| |
| \snippet animation/stickman/lifecycle.cpp 1 |
| |
| The states are then bound together with signal transitions that listen to the |
| propertiesAssigned() signal. |
| |
| \snippet animation/stickman/lifecycle.cpp 2 |
| |
| The last frame state is given a transition to the first one, so that the animation will loop |
| until it is interrupted when a transition out from the animation state is taken. To get smooth |
| animations between the different key frames, we set a default animation on the state machine. |
| This is a parallel animation group which contains animations for all the "position" properties |
| and will be selected by default when taking any transition that leads into a state that assigns |
| values to these properties. |
| |
| \snippet animation/stickman/lifecycle.cpp 3 |
| |
| Several such animation states are constructed, and are placed together as children of a top |
| level "alive" state which represents the stickman life cycle. Transitions go from the parent |
| state to the child state to ensure that each of the child states inherit them. |
| |
| \image stickman-example2.png |
| |
| This saves us the effort of connect every state to every state with identical transitions. The |
| state machine makes sure that transitions between the key frame animations are also smooth by |
| applying the default animation when interrupting one and starting another. |
| |
| Finally, there is a transition out from the "alive" state and into the "dead" state. This is |
| a custom transition type called LightningSrikesTransition which samples every second and |
| triggers at random (one out of fifty times on average.) |
| |
| \snippet animation/stickman/lifecycle.cpp 4 |
| |
| When it triggers, the machine will first enter a "lightningBlink" state which uses a timer to |
| pause for a brief period of time while the background color of the scene is white. This gives us |
| a flash effect when the lightning strikes. |
| |
| \snippet animation/stickman/lifecycle.cpp 5 |
| |
| We start and stop a QTimer object when entering and exiting the state. Then we transition into |
| the "dead" state when the timer times out. |
| |
| \snippet animation/stickman/lifecycle.cpp 0 |
| |
| When the machine is in the "dead" state, it will be unresponsive. This is because the "dead" |
| state has no transitions leading out. |
| |
| \image stickman-example3.png |
| |
| */ |