CECALA

 view release on metacpan or  search on metacpan

spaceinvaders/spaceInvaders.pl  view on Meta::CPAN

  $ship->names("me");
  $ship->place(30,250);
  $mw->bind('<Key>', [ sub {
      ($t::x,$t::y)=$ship->place;
      if ($_[1] == $Sprite::keycode::right) { $t::x2=$t::x+5; }
      elsif ($_[1] == $Sprite::keycode::left ) { $t::x2=$t::x-5; }
      elsif ($_[1] == $Sprite::keycode::fire ) {
          my $gun=new Sprite($c);
          $gun->image($img{"missle.gif"});
          $gun->names("missle","weapon");
          $gun->place($t::x, $t::y);
          push(@missles, {
              direction => -1,
              sprite => $gun,
              });
      }
      else { return; }
      $ship->place($t::x2,$t::y);
      if ( $ship->collide =~/right|left/) {
          $ship->place($t::x,$t::y);
      } }, Ev('k') ] );

  # Enemies
  my @badguys=();
  my $direction=1;    # Pos is right
  my $deathdelay=-3;  # How long splat is visible
  my $startrow=50;
  sub mkbadguys {
      @badguys=();
      $c->delete('alien');
      $c->delete('weapon');
      for my $t (1..2) {
          for my $i (1..9) {
              push(@badguys, { sprite=> new Sprite($c) });
              for($badguys[-1]) {
                  $_->{sprite}->image($img{"alien.gif"});
                  $_->{sprite}->place(25*$i, $startrow+$t*25);
                  $_->{sprite}->names("alien$t$i","alien");
              }
          }
      }
      $startrow+=10;
  }
  sub maint {
      march();
      missles();
      $c->update;
      if ($ship->collide=~/bomb/ or $be->collide=~/alien/) {
          $ship->image($img{"splat.gif"},1);
          $c->createText(100,10,-text => "Game Over");
          $mw->bind('<Key>', undef);
      } elsif (!@badguys) {
          mkbadguys();
          $c->after(100, \&maint);
      } else {
          $c->after(100, \&maint);
      }
  }
  my $downrow;
  sub march {
      my($collisions,$alive)=(0,0);
      for (@badguys) {
          delete $_->{oldloc};
          if ($_->{dead} && $_->{dead}<0 ) {
              if ($_->{dead} == $deathdelay) {
                  $_->{sprite}->names("");
                  $_->{sprite}->image($img{"splat.gif"},1);
                  $_->{dead}++;
                  $c->itemconfigure('score', -text => $score);
              }
              unless (++$_->{dead}) {
                  $_->{sprite}->remove;
                  $_->{dead}++;
              }
          }
          $alive++ unless $_->{dead};
      }
      @badguys=() unless $alive;
      for (@badguys) {
          next if $_->{dead};
          $_->{oldloc}=[ $_->{sprite}->place ];
          ($t::x, $t::y)=@{ $_->{oldloc} };
          $t::x+=$alienmove*$direction;
          $t::y+=$alienmove*4 if ($downrow);
          $_->{sprite}->place($t::x,$t::y);
          $a=$_->{sprite}->collide;
          if ($a=~/right|left/) {
              $collisions=1; last;
          }
          if ($a=~/missle/) {
              $_->{dead}=$deathdelay;
              $score+=10;
          }
          if (rand(1000)<5) {
              my $gun=new Sprite($c);
              $gun->image($img{"bomb.gif"});
              $gun->names("bomb","weapon");
              $gun->place($t::x, $t::y);
              push(@missles, { direction => 1, sprite => $gun, });
          }
      }
      $downrow=0;
      if ($collisions) {
          for(@badguys) {
              next if $_->{dead};
              next unless $_->{oldloc};
              $_->{sprite}->place(@{$_->{oldloc}});
          }
          $downrow=$direction*=-1;
      }
  }
  mkbadguys();
  $c->after(100, \&maint);
  $mw->MainLoop;

__DATA__
begin ship1.gif
R0lGODlhFAAUAPcAAAAAADH/796l9/echPf/GP8pEP//////////////////////////////////
N12N
/////////////////////////////////////////////////////ywAAAAAFAAUAAAIcwABCBw4
0ADBgwgLCjCYsKEBARAZNjz4MOJEihAzSpxYcaHGiwAqGggg8qIBkSQjbsQYMaXFhB0Xnsy4EGFM
mjhXdjz5kOdHhRYLEBBAoEDIn0drAhggtMAAgSWTbmT6FKjBngirEsR6EuTWlV7Dih0rMCAAOw==
begin alien.gif
R0lGODlhFAAUAPcAAAAAAADWEBiECKX37/9KGP//EP//////////////////////////////////
N12N
/////////////////////////////////////////////////////ywAAAAAFAAUAAAIfAABCAQw
YMDAgwQNIiwoUOFBhQwHOiT4sCJCAQUzahwgAGFDAAIEEChAsgCBkBQfkiTAsqTJlgUmDnBJk6ZM
lwEKBMiZs+TEhCV79oz5U+JMm0U9bkzqMaHGpkoNMowINWNDiFQXPpTZNKvXoj+zpjS6MCxWs2I3
lr1aNiAAOw==
begin bomb.gif
R0lGODlhCgAKAPcAAAAAAP//////////////////////////////////////////////////////
N12N
/////////////////////////////////////////////////////ywAAAAACgAKAAAIJAABAAgg
cGDBgwQPCkxoEKFBhg4VNpxYkCDEhgkvWpTIkGFAAAA7
begin missle.gif
R0lGODlhCgAKAPcAAAAAAKXn9/8pEP//GP//////////////////////////////////////////
N12N
/////////////////////////////////////////////////////ywAAAAACgAKAAAIMAABCAQQ



( run in 1.183 second using v1.01-cache-2.11-cpan-df04353d9ac )