Perl 逐行显示动画

使用 Perl 来完成一则文字逐字显示的动画。

myth.gif

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
use Win32::Console;
use Encode;
use 5.010;
use AnyEvent;


use Win32::Console::ANSI;
use Term::ANSIColor;
my @color = qw( red green yellow blue magenta cyan white
bright_black bright_red bright_green bright_yellow
bright_blue bright_magenta bright_cyan bright_white ansi0);


#my @color= map {'ansi'.$_} (0..15);
$|=1; #必须开启这个
system("mode con cols=135 lines=25");
my $Out = new Win32::Console(STD_OUTPUT_HANDLE) || die;
my $cv = AnyEvent->condvar;
my $count=0;
my $w; $w = AnyEvent->timer(
after => 2,
interval => 1,
cb => sub {
$count++;

my ( $x, $y ) = $Out->Cursor();
$Out->Cursor( $x+125, $y + 5,0,0);

while (<DATA>) {
s/ / /g;
chomp;
$a=decode('gb2312',$_);
@words=$a=~m/(.)/g;


foreach $word (@words) {
$c = $color[int rand @color];
print color 'bold '.$c;
$Out->Write(encode('gb2312',$word));
my ( $x, $y ) = $Out->Cursor();
$Out->Cursor( $x, $y + 1,0,1);

my ( $x, $y ) = $Out->Cursor();
$Out->Cursor( $x-2, $y,0,1);
select(undef,undef,undef,0.045);
}

my ( $x, $y ) = $Out->Cursor();
$Out->Cursor( $x-2, $y-@words,0,0);
}
# system("cls");
# say $count;
seek(DATA,1565,0); # 句柄读到最后了就没有文本了,所以需要返回,其实DATA就是整个文件,是这个script的所有文本。

if ($count >= 1) {
undef $w;
}
}
);
$cv->recv;
__END__




    星月神话
我的一生最美好的场景
 
就是遇见你
 
在人海茫茫中静静凝望着你
 
陌生又熟悉
 
尽管呼吸着同一天空的气息

却无法拥抱到你
 
如果转换了时空身份和姓名
   
但愿认得你眼睛
 
千年之后的你会在哪里
 
身边有怎样风景
 
我们的故事并不算美丽
 
却如此难以忘记
 
尽管呼吸着同一天空的气息
 
却无法拥抱到你
 
如果转换了时空身份和姓名
 
但愿认得你眼睛
 
千年之后的你会在哪里
 
身边有怎样风景
 
我们的故事并不算美丽
 
却如此难以忘记
 
如果当初勇敢的在一起
 
会不会不同结局
 
你会不会也有千言万语
 
埋在沉默的梦里

myth.png