source: trunk/doc/src/examples/stickman.qdoc@ 651

Last change on this file since 651 was 651, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.2 sources.

  • Property svn:eol-style set to native
File size: 5.6 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation (qt-info@nokia.com)
6**
7** This file is part of the documentation of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at qt-info@nokia.com.
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42/*!
43 \example animation/stickman
44 \title Stickman Example
45
46 The Stickman example shows how to animate transitions in a state machine to implement key frame
47 animations.
48
49 \image stickman-example.png
50
51 In this example, we will write a small application which animates the joints in a skeleton and
52 projects a stickman figure on top. The stickman can be either "alive" or "dead", and when in the
53 "alive" state, he can be performing different actions defined by key frame animations.
54
55 Animations are implemented as composite states. Each child state of the animation state
56 represents a frame in the animation by setting the position of each joint in the stickman's
57 skeleton to the positions defined for the particular frame. The frames are then bound together
58 with animated transitions that trigger on the source state's propertiesAssigned() signal. Thus,
59 the machine will enter the state representing the next frame in the animation immediately after
60 it has finished animating into the previous frame.
61
62 \image stickman-example1.png
63
64 The states for an animation is constructed by reading a custom animation file format and
65 creating states that assign values to the the "position" properties of each of the nodes in the
66 skeleton graph.
67
68 \snippet examples/animation/stickman/lifecycle.cpp 1
69
70 The states are then bound together with signal transitions that listen to the
71 propertiesAssigned() signal.
72
73 \snippet examples/animation/stickman/lifecycle.cpp 2
74
75 The last frame state is given a transition to the first one, so that the animation will loop
76 until it is interrupted when a transition out from the animation state is taken. To get smooth
77 animations between the different key frames, we set a default animation on the state machine.
78 This is a parallel animation group which contains animations for all the "position" properties
79 and will be selected by default when taking any transition that leads into a state that assigns
80 values to these properties.
81
82 \snippet examples/animation/stickman/lifecycle.cpp 3
83
84 Several such animation states are constructed, and are placed together as children of a top
85 level "alive" state which represents the stickman life cycle. Transitions go from the parent
86 state to the child state to ensure that each of the child states inherit them.
87
88 \image stickman-example2.png
89
90 This saves us the effort of connect every state to every state with identical transitions. The
91 state machine makes sure that transitions between the key frame animations are also smooth by
92 applying the default animation when interrupting one and starting another.
93
94 Finally, there is a transition out from the "alive" state and into the "dead" state. This is
95 a custom transition type called LightningSrikesTransition which samples every second and
96 triggers at random (one out of fifty times on average.)
97
98 \snippet examples/animation/stickman/lifecycle.cpp 4
99
100 When it triggers, the machine will first enter a "lightningBlink" state which uses a timer to
101 pause for a brief period of time while the background color of the scene is white. This gives us
102 a flash effect when the lightning strikes.
103
104 \snippet examples/animation/stickman/lifecycle.cpp 5
105
106 We start and stop a QTimer object when entering and exiting the state. Then we transition into
107 the "dead" state when the timer times out.
108
109 \snippet examples/animation/stickman/lifecycle.cpp 0
110
111 When the machine is in the "dead" state, it will be unresponsive. This is because the "dead"
112 state has no transitions leading out.
113
114 \image stickman-example3.png
115
116*/
Note: See TracBrowser for help on using the repository browser.