#! /opt/perl/bin/perl package player; use Moose; use List::Util qw[min max]; use SDL::Events; use Time::HiRes; use Data::Dumper; use btype; extends 'ship'; has 'score' => (is => 'rw', isa => 'Int', default => 0); has 'bullets' => (is => 'rw', isa => 'ArrayRef[bullet]'); has 'ammo' => (is => 'rw', isa => 'Int', default => 1000); has 'max_ammo' => (is => 'rw', isa => 'Int', default => 1000); sub fire_react { my $self = shift; my $event = shift; my $keys = SDL::Events::get_key_state; if ($keys->[SDLK_SPACE] && $self->{ammo} > 0) { push (@{$self->{bullets}}, btype->get_shot(1, $self->{position})); $self->{ammo} -= 1; } elsif (!$keys->[SDLK_SPACE]) { $self->{ammo} = min($self->{ammo} + 1, $self->{max_ammo}); } } sub move_bullets { my ($self, $step, $app, $time) = @_; my @tbullets; my $length = 0; foreach my $bullet (@{$self->{bullets}}) { if ($bullet->{position}->{y} < -5 || $bullet->{position}->{y} > $app->h + 5) { push(@tbullets, $bullet); } elsif ($bullet->{position}->{x} < -5 || $bullet->{position}->{x} > $app->w + 5) { push(@tbullets, $bullet); } else { unshift(@tbullets, $bullet); $length += 1; } } @{$self->{bullets}} = splice(@tbullets, 0, $length); foreach my $bullet (@{$self->{bullets}}) { $bullet->move($step); } } sub draw_bullets { my $self = shift; foreach my $bullet (@{$self->{bullets}}) { $bullet->draw(@_); } } 1;