Games-2048
view release on metacpan or search on metacpan
lib/Games/2048/Util.pm view on Meta::CPAN
my $char;
my $packet = '';
while (defined($char = ReadKey -1)) {
$packet .= $char;
}
push @keys, $packet =~ m(
\G(
\e \[ # CSI
[\x30-\x3f]* # Parameter Bytes
[\x20-\x2f]* # Intermediate Bytes
[\x40-\x7e] # Final Byte
|
. # Otherwise just any character
)
)gsx;
return shift @keys;
}
sub poll_key {
while (1) {
my $key = read_key;
return $key if defined $key;
Time::HiRes::sleep(0.1);
}
return;
}
sub key_vector {
my ($key) = @_;
state $vectors = [ [0, -1], [0, 1], [1, 0], [-1, 0] ];
state $keys = [ map "\e[$_", "A".."D" ];
for (0..3) {
return $vectors->[$_] if $key eq $keys->[$_];
}
return;
}
sub frame_delay {
state $time;
if (@_ < 1) {
$time = Time::HiRes::time;
}
else {
my ($frame_time) = @_;
my $new_time = Time::HiRes::time;
my $delta_time = $new_time - $time;
my $delay = $frame_time - $delta_time;
$time = $new_time;
if ($delay > 0) {
Time::HiRes::sleep($delay);
$time += $delay;
}
}
}
sub update_window_size {
($_window_size) = eval { GetTerminalSize *STDOUT };
$_window_size //= 80;
}
sub window_size {
$_window_size;
}
sub window_size_is_automatic {
$_window_size_is_automatic;
}
sub maybe {
if (@_ == 2) { return @_ if defined $_[1] }
elsif (@_ == 1) { return @_ if defined $_[0] }
return;
}
1;
( run in 0.824 second using v1.01-cache-2.11-cpan-fe3c2283af0 )