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 )