package MTools::Comp::MTremor; # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU LGPL Libray General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA, # or refer to http://www.gnu.org/copyleft/lgpl.html # ################################################################## # Le composant permet d'ajouter un comportement de tremblement ? un objet cible # # Parametres : # * target : objet cible du tremblement # * %options : table de hash permettant la configuration initiale des proprietes # Propriete : # * timeout : periode / 2 du tremblement # * target : cible # * amplitude_x, amplitude_y : amplitude du deplacement # * -visible : visibilite versus activation du comportement use strict; use MTools; #use MTools::MSwitch; use MTools::MTimer; use vars qw /@ISA/; BEGIN { @ISA = qw /MTools::MObjet/; } use Tk; sub new { my ($class, $target, %options) = @_; $self -> {__timer} = my $timer = new MTools::MTimer (200, 1, \&tremble); my $self = new MTools::MObjet (); # $self -> {__sw} = new MTools::MSwitch ( # $parent, # tremble => [$timer], # fixe => [], # ); # $self -> {__sw} -> mconfigure (state => 'fixe'); $timer -> mconfigure ( callback => [$self, '__tremble']); bless $self, $class; $self -> recordProperty ('timeout', 200); $self -> recordProperty ('target', $target); $self -> recordProperty ('amplitude_x', 2); $self -> recordProperty ('amplitude_y', 2); $self -> recordProperty ('-visible', 0); $self -> plisten ('-visible', sub { my ($src, $key, $val) = @_; if ($val == 0) { $self -> __stop (); } else { $self -> __start (); } }); $self -> mconfigure (%options); plink ([$self, 'timeout'], [$timer, 'timeout']); $self -> {__timer} = $timer; $self -> {__x} = 0; $self -> {__y} = 0; $self -> {__started} = 0; return $self; } sub __tremble { my ($self) = @_; my $target = $self -> mget ('target'); my $dx = -2 * $self -> {__x}; my $dy = -2 * $self -> {__y}; $self -> {__x} = -$self -> {__x}; $self -> {__y} = -$self -> {__y}; $target -> translate ($dx, $dy); } sub __start { my ($self) = @_; if ($self -> {__started}) {return;} $self -> {__started} = 1; my $target = $self -> mget ('target'); my $amplitudex = $self -> mget ('amplitude_x'); my $amplitudey = $self -> mget ('amplitude_y'); $self -> {__x} = $amplitudex; $self -> {__y} = $amplitudey; $target -> translate ($amplitudex, $amplitudey); # $self -> {__sw} -> mconfigure ('state' => 'tremble'); $self -> {__timer} -> start (); } sub __stop { my ($self) = @_; if (!$self -> {__started}) {return;} $self -> {__started} = 0; my $target = $self -> mget ('target'); $target -> translate (-$self -> {__x}, -$self -> {__y}); $self -> {__x} = 0; $self -> {__y} = 0; $self -> {__sw} -> mconfigure ('state' => 'fixe'); $self -> {__timer} -> stop (); } 1;