Отображение анимированного изображения - PullRequest
1 голос
/ 12 марта 2012
use warnings;
use Tk;
use Tk::Animation;

my $scr = new MainWindow;

$scr->configure(-background=>"black");
$scr->geometry("200x100");

my $canvas = $scr->Canvas(-width,200,-height,100,-background=>"black")
                 ->pack(-expand,1,-fill,'both');

my $image  = $scr->Animation('-format' => 'gif', -file=>"help.gif" );

$canvas->createImage( 50,50, -image=> $image);
$image->start_animation(500);

MainLoop;

Я хочу, чтобы изображение двигалось вверх и вниз в моем окне. Теперь, что мне еще добавить в этот код ??

1 Ответ

0 голосов
/ 29 сентября 2012

Tk :: Animation отвечает только за анимацию файла Gif. Анимация в этом случае означает, что все время меняются кадры. Таким образом, движение ограничено содержанием самого изображения.

Если вы хотите переместить изображение целиком на холсте, вы должны использовать метод перемещения. Конечно, это можно сочетать с анимацией GIF.

Вот пример с перемещением картинки слева направо:

#!perl

use strict;
use warnings;
use Tk;
use Tk::Animation;

my $mw = MainWindow->new();
$mw->configure(-background=>"black");
$mw->geometry("200x100");

my $canvas = $mw->Canvas(
    -width => 200,
    -height => 100,
    -background => 'black',
)->pack(
    -expand => 1,
    -fill => 'both',
);

my $image  = $mw->Animation(
    -format => 'gif',
    -file => 'oi.gif',
    # please use this one: http://images1.wikia.nocookie.net/vaultarmory/images/2/23/Gif_dancinggir.gif
);

# -- clear transparent background while drawing
$image->set_disposal_method( 1 );

my $id_of_image_in_canvas = $canvas->createImage(
    50, 50,
    -image=> $image,
);
$image->start_animation(80);

# -- store the current mving direction
my $direction = 'moving2left';
$mw->repeat(600, \&move_item_in_canvas);

$mw->MainLoop();
exit(0);


sub move_item_in_canvas {
    # -- get current location
    my ($x1, $y1, $x2, $y2) = $canvas->bbox($id_of_image_in_canvas);

    # -- compute if to move left or right
    my $min_left = 0;
    my $max_right = 200;
    if( $direction eq 'moving2left' && $x1 > $min_left ) {
        # continue moving left
        $canvas->move($id_of_image_in_canvas, -10, 0);

    }elsif( $direction eq 'moving2left' && $x1 <= $min_left ) {
        # change direction, move to the right
        $direction = 'moving2right';
        $canvas->move($id_of_image_in_canvas, 10, 0);

    }elsif( $direction eq 'moving2right' && $x2 < $max_right ) {
        # move right
        $canvas->move($id_of_image_in_canvas, 10, 0);

    }elsif( $direction eq 'moving2right' && $x2 >= $max_right ){
        # change direction, move to the left
        $direction = 'moving2left';
        $canvas->move($id_of_image_in_canvas, -10, 0);

    }else{
        die('Error: don\'t know what to do in this case.');
    }

    return;
} # /move_item_in_canvas
...