From: Martin Mares Date: Mon, 29 Oct 2007 09:51:21 +0000 (+0100) Subject: Better player controls. X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=e433811f713abe97e6e5d7d7060880d905e20433;p=anim.git Better player controls. --- diff --git a/AA/UI.pm b/AA/UI.pm index f1d63b3..d74f544 100644 --- a/AA/UI.pm +++ b/AA/UI.pm @@ -35,6 +35,7 @@ my $u_scene; my $u_frame; my $u_direction; my @u_scenes = (); +my @u_last_frame = (); my $window; my $cairo; @@ -71,7 +72,6 @@ sub draw($) { $pixmap = Gtk2::Gdk::Pixmap->new($win, $pixw, $pixh, $d); $cairo = Gtk2::Gdk::Cairo::Context->create($pixmap); - $cairo->select_font_face('URW Palladio L', 'normal', 'normal'); my $scale = $pixw/1024; $cairo->scale($scale, $scale); } @@ -107,18 +107,22 @@ sub step() { # FIXME: the timer still runs if (@u_scenes) { if ($u_direction > 0) { - if ($u_frame < @{$u_scenes[$u_scene]}-1) { + if ($u_frame < $u_last_frame[$u_scene]) { $u_frame++; - } elsif ($movie && $u_scene < @u_scenes - 1) { + } elsif ($u_scene < @u_scenes - 1) { $u_scene++; $u_frame = 0; } + if ($u_frame == $u_last_frame[$u_scene]) { + $u_direction = 0 unless $movie; + } } elsif ($u_direction < 0) { if ($u_frame) { $u_frame--; - } elsif ($movie && $u_scene) { + } elsif ($u_scene) { $u_scene--; - $u_frame = @{$u_scenes[$u_scene]} - 1; + $u_frame = $u_last_frame[$u_scene]; + $u_direction = 0 unless $movie; } } return if ($u_scene == $last_scene && $u_frame == $last_frame); @@ -153,11 +157,18 @@ sub prepare() { } } elsif ($k eq "space" || $k eq "Right" || $k eq "Page_Down") { if (@u_scenes) { - if ($u_direction > 0 && $u_scene+1 < @u_scenes) { - $u_scene++; - $u_frame = 0; + if ($stopped || $k eq "Page_Down") { + if ($u_scene+1 < @u_scenes) { + $u_scene++; + $u_frame = $u_last_frame[$u_scene]; + } + $u_direction = 0; + } elsif ($u_direction > 0) { + $u_frame = $u_last_frame[$u_scene]; + $u_direction = 0; + } else { + $u_direction = 1; } - $u_direction = 1; draw(0); } else { while (AA::Anim->step) { AA->calculate; } @@ -169,37 +180,44 @@ sub prepare() { } } } elsif ($k eq "BackSpace" || $k eq "Left" || $k eq "Page_Up") { - if (@u_scenes && $u_scene) { - if (!$u_frame || $u_direction < 0) { - $u_scene--; - $u_frame = @{$u_scenes[$u_scene]}-1; + if (@u_scenes) { + if ($stopped || $k eq "Page_Up") { + if ($u_scene > 0) { + $u_scene--; + $u_frame = $u_last_frame[$u_scene]; + } + $u_direction = 0; + } elsif ($u_direction < 0) { + $u_frame = 0; + } else { + $u_direction = -1; } - $u_direction = -1; draw(0); } } elsif ($k eq "Home" || $k eq "0") { if (@u_scenes) { $u_scene = 0; $u_frame = 0; - $u_direction = 1; + $u_direction = 0; draw(0); } } elsif ($k eq "End" || $k eq "9") { if (@u_scenes) { $u_scene = $#u_scenes; - $u_frame = @{$u_scenes[$u_scene]}-1; - $u_direction = 1; + $u_frame = $u_last_frame[$u_scene]; + $u_direction = 0; draw(0); } } elsif ($k eq "p") { $stopped = !$stopped; + $u_direction = 0 if $stopped; print "Stopped is $stopped\n" if $debug; } elsif ($k eq "m") { $movie = !$movie; print "Movie mode is $movie\n" if $debug; } elsif ($k eq "Return") { if (@u_scenes) { - $u_frame = ($u_direction > 0) ? @{$u_scenes[$u_scene]}-1 : 0; + $u_frame = ($u_direction > 0) ? $u_last_frame[$u_scene] : 0; } else { while (AA::Anim->step) { AA->calculate; } } @@ -230,6 +248,7 @@ sub RunScenario($$) { push @$show, AA::Scene->new(); } push @u_scenes, $show; + push @u_last_frame, scalar @$show - 1; } print "Ready.\n"; } else {