Games-Snake
view release on metacpan or search on metacpan
lib/Games/Snake.pm view on Meta::CPAN
my $player = $self->player;
if ( $event->type == SDL_KEYDOWN ) {
$player->direction( [ -1, 0 ] ) if $event->key_sym == SDLK_LEFT;
$player->direction( [ 1, 0 ] ) if $event->key_sym == SDLK_RIGHT;
$player->direction( [ 0, -1 ] ) if $event->key_sym == SDLK_UP;
$player->direction( [ 0, 1 ] ) if $event->key_sym == SDLK_DOWN;
my $key = SDL::Events::get_key_name( $event->key_sym );
if ( !$player->alive && $key eq 'r' ) {
$self->player( $self->_build_player );
}
}
}
sub handle_move {
my ( $self, $step, $app, $t ) = @_;
my $level = $self->level;
my $player = $self->player;
$player->move($t);
if ( $player->hit_self() || $level->is_wall( $player->head ) ) {
$player->alive(0);
}
elsif ($player->head->[0] == $self->apple->[0]
&& $player->head->[1] == $self->apple->[1] )
{
$player->speed( $player->speed * 0.9 );
$player->growing( $player->growing + 10 );
$self->apple( $self->_build_apple );
}
}
lib/Games/Snake.pm view on Meta::CPAN
$app->draw_rect( [ 0, 0, $app->w, $app->h ], 0x000000FF );
my $size = $self->size;
$app->draw_rect(
[ ( map { $_ * $size } @{ $self->apple } ), $size, $size ],
0xC20006FF );
$self->player->draw($app);
$self->level->draw($app);
if ( !$self->player->alive ) {
$app->draw_gfx_text( [ 12, 12 ],
0xFFFFFFFF,
'Snake length: ' . scalar @{ $self->player->segments } );
$app->draw_gfx_text( [ 12, 22 ], 0xFFFFFFFF, 'Press R to restart' );
}
$app->update();
}
1;
lib/Games/Snake/Player.pm view on Meta::CPAN
isa => Num,
default => quote_sub q{ 0 },
);
has direction => (
is => 'rw',
isa => ArrayRef,
default => quote_sub q{ [] },
);
has alive => (
is => 'rw',
isa => Bool,
default => quote_sub q{ 1 },
);
has growing => (
is => 'rw',
isa => Int,
default => quote_sub q{ 0 },
);
lib/Games/Snake/Player.pm view on Meta::CPAN
sub body {
my ($self) = @_;
my @segments = @{ $self->segments };
return [ @segments[ 1 .. $#segments ] ];
}
sub move {
my ( $self, $t ) = @_;
return unless $self->alive;
return unless $t >= $self->_move_time + $self->speed;
$self->_move_time($t);
my $segments = $self->segments;
my @head = @{ $self->head };
my @d = @{ $self->direction };
unshift @$segments, [ $head[0] + $d[0], $head[1] + $d[1] ];
( run in 0.620 second using v1.01-cache-2.11-cpan-39bf76dae61 )