Games-PangZero
view release on metacpan or search on metacpan
lib/Games/PangZero/PlayableGameBase.pm view on Meta::CPAN
@ISA = qw( Games::PangZero::GameBase );
use strict;
use warnings;
sub new {
my ($class) = @_;
my $self = Games::PangZero::GameBase->new();
%{$self} = (%{$self},
'playersalive' => 0,
'level' => 0,
'backgrounds' => [ qw( desert2.png l1.jpg l2.jpg l3.jpg l4.jpg l5.jpg l6.jpg l7.jpg l8.jpg l9.jpg )],
);
bless $self, $class;
}
sub ResetGame {
my $self = shift;
$self->SUPER::ResetGame();
$self->{playersalive} = 0;
$Games::PangZero::GamePause = 0;
foreach my $player (@Games::PangZero::Players) {
last if $player->{number} >= $Games::PangZero::NumGuys;
$self->SpawnPlayer($player);
}
$self->SetGameLevel(0);
$self->LayoutScoreBoard();
push @Games::PangZero::GameObjects, (Games::PangZero::FpsIndicator->new());
}
lib/Games/PangZero/PlayableGameBase.pm view on Meta::CPAN
sub SpawnPlayer {
my ($self, $player) = @_;
$player->{score} = 0;
$player->{scoreforbonuslife} = 200000;
$player->{lives} = 2;
$player->{startX} = ($Games::PangZero::ScreenWidth - $Games::PangZero::NumGuys * 60) / 2 + 60 * ($player->{number}+0.5) - 32;
$player->{respawn} = -1;
my $guy = Games::PangZero::Guy->new($player);
push @Games::PangZero::GameObjects, ($guy);
++$self->{playersalive};
return $guy;
}
sub AdvanceGameObjects {
my ($self) = @_;
$self->SUPER::AdvanceGameObjects();
$self->RespawnPlayers();
--$Games::PangZero::GamePause if $Games::PangZero::GamePause > 0;
}
sub RespawnPlayers {
my $self = shift;
foreach my $player (@Games::PangZero::Players) {
last if $player->{number} >= $Games::PangZero::NumGuys;
if ($player->{respawn} > 0) {
--$player->{respawn};
$player->{score} = int($player->{respawn} / 100) if $self->{playersalive};
if ($player->{respawn} <= 0) {
my $guy = $self->SpawnPlayer($player);
$guy->{invincible} = 500;
}
}
}
}
sub PlayerNextLife {
my ($self, $guy) = @_;
lib/Games/PangZero/PlayableGameBase.pm view on Meta::CPAN
$guy->{state} = 'idle';
$guy->{speedY} = $guy->{speedX} = 0;
$guy->{invincible} = 500; # 0.5s
$guy->{killed} = 0;
$guy->{justkilled} = 0;
$self->{playerspawned} = 1;
} else {
# One player less
Games::PangZero::Highscore::AddHighScore($guy->{player}, $guy->{player}->{score}, $self->{level} + 1);
$guy->Delete();
--$self->{playersalive};
$guy->{player}->{respawn} = 6000; # 60s
}
}
sub PlayerDeathSequence {
my $self = shift;
my (@killedGuys, @deadGuys, $guy, $i);
$self->DrawGame();
Games::PangZero::Music::PlaySound('death');
lib/Games/PangZero/PlayableGameBase.pm view on Meta::CPAN
}
if ($Games::PangZero::GameEvents{'pop'}) {
Games::PangZero::Music::PlaySound('pop');
}
if ($Games::PangZero::GameEvents{meltdown} and $Games::PangZero::DifficultyLevel->{name} ne 'Miki') {
$self->DeathballMeltdown();
} elsif ($Games::PangZero::GameEvents{kill} ) {
$self->PlayerDeathSequence();
return if $self->{playersalive} <= 0;
$Games::PangZero::GamePause = 200 if $Games::PangZero::GamePause < 200;
Games::PangZero::GamePause::Show();
} elsif ($Games::PangZero::GameEvents{magic}) {
if ($Games::PangZero::GamePause < 200) {
$Games::PangZero::GamePause = 200;
Games::PangZero::Music::PlaySound('pause');
Games::PangZero::GamePause::Show();
}
} elsif ($Games::PangZero::GameEvents{superpause}) {
if ($Games::PangZero::GamePause < 800) {
lib/Games/PangZero/PlayableGameBase.pm view on Meta::CPAN
# Advance the game
%Games::PangZero::Events = ();
Games::PangZero::HandleEvents();
while ($advance--) {
return if $self->{abortgame};
$self->AdvanceGame();
}
if ($self->{playersalive} <= 0) {
my $gameoverSurface = SDL::Image::load("$Games::PangZero::DataDir/gameover.png");
my @gameObjects = @Games::PangZero::GameObjects;
foreach (@gameObjects) { $_->Delete() if ('Games::PangZero::DeadGuy' eq ref $_); }
$self->DrawGame();
SDL::Video::blit_surface($gameoverSurface, SDL::Rect->new(0, 0, $gameoverSurface->w, $gameoverSurface->h),
$Games::PangZero::App, SDL::Rect->new(
($Games::PangZero::PhysicalScreenWidth - $gameoverSurface->w) / 2, $Games::PangZero::PhysicalScreenHeight / 2 - 100,
$gameoverSurface->w, $gameoverSurface->h));
$Games::PangZero::App->sync();
SDL::delay(1000);
( run in 1.987 second using v1.01-cache-2.11-cpan-39bf76dae61 )