1
by Ross Burton
Import upstream version 0.2.0 |
1 |
package Clutter::Ex::Behaviour::Rotate; |
2 |
||
1.1.1
by Ross Burton
Import upstream version 0.4.1 |
3 |
# behaviour.pl: Example showing the behaviours API in Clutter |
4 |
# Copyright (C) 2007 OpenedHand, Ltd. |
|
5 |
# Author: Emmanuele Bassi |
|
6 |
#
|
|
7 |
# This is free software. Permission to redistribute and/or modify it under |
|
8 |
# the same terms of Perl itself. |
|
9 |
||
1
by Ross Burton
Import upstream version 0.2.0 |
10 |
use strict; |
11 |
use warnings; |
|
12 |
||
13 |
use Glib; |
|
14 |
use Clutter; |
|
15 |
||
16 |
# we need to register these enums first hand, so that the |
|
17 |
# object registering code can find them when defining the |
|
18 |
# properties of the Clutter::Ex::Behaviour::Rotate. |
|
19 |
sub BEGIN { |
|
20 |
Glib::Type->register_enum( |
|
21 |
'Clutter::Ex::RotateDirection', |
|
22 |
'clockwise', |
|
23 |
'anticlockwise', |
|
24 |
);
|
|
25 |
||
26 |
Glib::Type->register_enum( |
|
27 |
'Clutter::Ex::RotateAxis', |
|
28 |
'x', |
|
29 |
'y', |
|
30 |
'z', |
|
31 |
);
|
|
32 |
}
|
|
33 |
||
34 |
use Glib::Object::Subclass |
|
35 |
'Clutter::Behaviour', |
|
36 |
signals => { }, |
|
37 |
properties => [ |
|
38 |
Glib::ParamSpec->double( |
|
39 |
'angle-start', |
|
40 |
'Angle Start', |
|
41 |
'Initial angle value', |
|
42 |
0.0, 359.0, 0.0, |
|
43 |
[ qw( readable writable ) ], |
|
44 |
),
|
|
45 |
Glib::ParamSpec->double( |
|
46 |
'angle-end', |
|
47 |
'Angle End', |
|
48 |
'Final angle value', |
|
49 |
0.0, 359.0, 359.0, |
|
50 |
[ qw( readable writable ) ], |
|
51 |
),
|
|
52 |
Glib::ParamSpec->enum( |
|
53 |
'direction', |
|
54 |
'Direction', |
|
55 |
'Direction of the rotation', |
|
56 |
'Clutter::Ex::RotateDirection', |
|
57 |
'clockwise', |
|
58 |
[ qw( readable writable ) ], |
|
59 |
),
|
|
60 |
Glib::ParamSpec->enum( |
|
61 |
'axis', |
|
62 |
'Axis', |
|
63 |
'Axis of the rotation', |
|
64 |
'Clutter::Ex::RotateAxis', |
|
65 |
'z', |
|
66 |
[ qw( readable writable ) ], |
|
67 |
),
|
|
68 |
]
|
|
69 |
;
|
|
70 |
||
71 |
sub INIT_INSTANCE { |
|
72 |
my ($self) = @_; |
|
73 |
||
74 |
$self->{angle_start} = 0.0; |
|
75 |
$self->{angle_end} = 359.0; |
|
76 |
$self->{direction} = 'clockwise'; |
|
77 |
$self->{axis} = 'z'; |
|
78 |
}
|
|
79 |
||
80 |
sub ALPHA_NOTIFY { |
|
81 |
my ($self, $alpha_value) = @_; |
|
82 |
||
83 |
my $angle = $alpha_value |
|
84 |
* ($self->{angle_end} - $self->{angle_start}) |
|
85 |
/ Clutter::Alpha->MAX_ALPHA; |
|
86 |
||
87 |
my @actors = $self->get_actors(); |
|
88 |
return unless scalar @actors; |
|
89 |
||
90 |
foreach my $actor (@actors) { |
|
1.1.2
by Ross Burton
Import upstream version 0.6.0.0 |
91 |
$actor->set_rotation('z-axis', $angle, |
92 |
$actor->get_x() - 20, |
|
93 |
$actor->get_y() - 20, |
|
94 |
0); |
|
1
by Ross Burton
Import upstream version 0.2.0 |
95 |
}
|
96 |
}
|
|
97 |
||
98 |
package main; |
|
99 |
||
100 |
use strict; |
|
101 |
use warnings; |
|
102 |
||
103 |
use Glib qw( :constants ); |
|
1.1.1
by Ross Burton
Import upstream version 0.4.1 |
104 |
use Clutter qw( :init ); |
1
by Ross Burton
Import upstream version 0.2.0 |
105 |
|
106 |
my $stage = Clutter::Stage->get_default(); |
|
107 |
$stage->set_color(Clutter::Color->new(0xcc, 0xcc, 0xcc, 0xff)); |
|
108 |
$stage->signal_connect(key_press_event => sub { Clutter->main_quit(); }); |
|
109 |
||
110 |
my $group = Clutter::Group->new(); |
|
111 |
$stage->add($group); |
|
112 |
$group->show(); |
|
113 |
||
114 |
my $rect = Clutter::Rectangle->new(); |
|
115 |
$rect->set_size(100, 100); |
|
116 |
$rect->set_position(0, 0); |
|
117 |
$rect->set_color(Clutter::Color->new(0x33, 0x22, 0x22, 0xff)); |
|
118 |
$rect->set_border_width(10); |
|
119 |
$rect->set_border_color(Clutter::Color->new(0xff, 0xcc, 0xcc, 0xff)); |
|
120 |
||
121 |
$group->add($rect); |
|
122 |
$rect->show(); |
|
123 |
||
1.2.1
by Ross Burton
Import upstream version 0.8.0.1 |
124 |
my $hand; |
125 |
eval { $hand = Clutter::Texture->new('redhand.png') }; |
|
1
by Ross Burton
Import upstream version 0.2.0 |
126 |
if ($@) { |
127 |
warn ("Unable to load 'redhand.png': $@"); |
|
128 |
}
|
|
129 |
else { |
|
130 |
$hand->set_position(5, 5); |
|
131 |
||
1.2.1
by Ross Burton
Import upstream version 0.8.0.1 |
132 |
$rect->set_size($hand->get_width() + 5, |
133 |
$hand->get_height() + 5); |
|
1
by Ross Burton
Import upstream version 0.2.0 |
134 |
|
135 |
$group->add($hand); |
|
136 |
$hand->show(); |
|
137 |
}
|
|
138 |
||
139 |
my $timeline = Clutter::Timeline->new(100, 26); |
|
140 |
$timeline->set(loop => TRUE); |
|
141 |
||
1.1.2
by Ross Burton
Import upstream version 0.6.0.0 |
142 |
my $alpha = Clutter::Alpha->new($timeline, sub { |
143 |
my $alpha = shift; |
|
144 |
my $timeline = $alpha->get_timeline(); |
|
145 |
||
146 |
return int($timeline->get_progress() * Clutter::Alpha->MAX_ALPHA); |
|
147 |
});
|
|
148 |
||
1
by Ross Burton
Import upstream version 0.2.0 |
149 |
my $o_behave = Clutter::Behaviour::Opacity->new($alpha, 0x33, 0xff); |
150 |
$o_behave->apply($group); |
|
151 |
||
152 |
my $p_behave |
|
153 |
= Clutter::Behaviour::Path->new($alpha, |
|
154 |
[ 0, 0 ], |
|
155 |
[ 0, 300 ], |
|
156 |
[ 300, 300 ], |
|
157 |
[ 300, 0 ], |
|
158 |
[ 0, 0 ], |
|
159 |
);
|
|
160 |
$p_behave->apply($group); |
|
161 |
||
162 |
my $r_behave |
|
163 |
= Clutter::Ex::Behaviour::Rotate->new(alpha => $alpha); |
|
164 |
$r_behave->apply($group); |
|
165 |
||
166 |
$timeline->start(); |
|
167 |
||
168 |
$stage->show(); |
|
169 |
||
170 |
Clutter->main(); |
|
171 |
||
172 |
0; |