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 )