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 )