]> mj.ucw.cz Git - anim.git/commitdiff
Added a skeleton of the animator module.
authorMartin Mares <mj@ucw.cz>
Fri, 26 Oct 2007 19:04:35 +0000 (21:04 +0200)
committerMartin Mares <mj@ucw.cz>
Fri, 26 Oct 2007 19:04:35 +0000 (21:04 +0200)
AA.pm
AA/Anim.pm [new file with mode: 0644]
a.pl

diff --git a/AA.pm b/AA.pm
index f402f4154a24edc4edd65dcf7e5af8d88a27c02c..631958a8885cea69a92a3af2a9e83b8d249982d1 100644 (file)
--- a/AA.pm
+++ b/AA.pm
@@ -35,10 +35,10 @@ sub calculate($) {
        while ($o = shift @pending_recalcs) {
                print "Going to recalculate object $o\n" if $debug;
                my $pend = $o->{PENDING};
+               delete $o->{PENDING};
                foreach my $a (keys %$pend) {
                        $o->Calc("$a");
                }
-               delete $o->{PENDING};
        }
 }
 
diff --git a/AA/Anim.pm b/AA/Anim.pm
new file mode 100644 (file)
index 0000000..a399d6b
--- /dev/null
@@ -0,0 +1,28 @@
+package AA::Anim;
+
+our $timer = AA->new('T');
+$timer->DefSet('T', 0);
+
+sub time($) {
+       return $timer->Get('T');
+}
+
+sub step($) {
+       $timer->Set('T', $timer->Get('T') + 1);
+       AA->calculate;
+}
+
+sub ticker($$$$) {
+       my ($class, $x0, $x1, $dt) = @_;
+       my $t0 = AA::Anim->time;
+       return sub {
+               my $t = AA::Anim->time;
+               if ($t - $t0 >= $dt) {
+                       return $x1;
+               } else {
+                       return $x0 + ($x1 - $x0) * ($t - $t0)/$dt;
+               }
+       };
+}
+
+1;
diff --git a/a.pl b/a.pl
index 3c87c91edd7700fc866150e67758e984acd57e54..59829c7f22767669ee606ec47f0bece6d89a910b 100755 (executable)
--- a/a.pl
+++ b/a.pl
@@ -9,6 +9,7 @@ use Cairo;
 use AA;
 use AA::Graph;
 use AA::Net;
+use AA::Anim;
 
 my $v = AA::NetV->new('v');
 $v->Set('x', 100);
@@ -16,7 +17,7 @@ $v->Set('y0', 100);
 $v->Set('label', '1');
 
 my $w = AA::NetV->new('w');
-$w->Set('x', 200);
+$w->Bind('x', AA::Anim->ticker(200, 600, 200));
 $w->Set('y0', 100);
 $w->Set('label', '2');
 
@@ -80,11 +81,15 @@ sub draw($) {
 }
 
 sub step() {
+       AA::Anim->step;
        draw(0);
 }
 
-my $timer = 1;
+my $window = Gtk2::Window->new ('toplevel');
+
+my $timer;
 my $stopped = 1;
+my $fullscreen = 0;
 $area->signal_connect("expose-event" => sub {
        draw(1);
        if (!defined $timer) {
@@ -101,16 +106,20 @@ $area->signal_connect('key-press-event' => sub {
                Gtk2->main_quit;
        } elsif ($k eq "space") {
                $stopped = !$stopped;
+       } elsif ($k eq "f") {
+               if ($fullscreen = !$fullscreen) {
+                       $window->fullscreen;
+               } else {
+                       $window->unfullscreen;
+               }
        }
 });
 
-my $window = Gtk2::Window->new ('toplevel');
 $window->signal_connect ("delete-event" => sub { Gtk2->main_quit });
 $window->set_title("Brum");
 $window->set_wmclass("brum", "Brum");
 $window->set_default_size(640, 480);
 $window->add ($area);
 $window->show_all;
-#$window->fullscreen;
 
 Gtk2->main;