package Firework; use Firework::Rockets; use Firework::Catherine; use strict; sub new { my $display={fireworks=>[],Time=>0}; bless$display; return$display; } sub add_rocket { my ($display,@args)=@_; my $firework=Firework::Rockets->new(@_); push@{$display->{fireworks}},$firework; } sub add_wheel { my($display,@args)=@_; my $wheel=Firework::Catherine->new(@_); push@{$display->{fireworks}},$wheel; } sub start_display { my $display=shift; my $live_fireworks=1; $|=1; while($live_fireworks){ $live_fireworks=0; print "\ec"; $display->{Time}+=1; foreach my $firework (@{$display->{fireworks}}){ if(!$firework->{dead}){ $live_fireworks++; if($firework->{exploded}){ $firework->post_explode; } else { if($firework->should_explode ){ $firework->explode; } else { if($display->{Time}>$firework->{start}){ $firework->draw; $firework->{timer}+=.1; } } } } } select undef,undef,undef,0.1 } } # and some defaults; sub draw { my $firework=shift; if($firework->y_t > 0 && $firework->y_t < 25 && $firework->x_t > 0 && $firewor k->x_t < 80){ printf"\e[%d;%dH\e[1;%dm.\e[m\e[H",$firework->y_t, $firework->x_t, $firework->{colour}; } } sub x_t { my $firework=shift; return $firework->{i_x}+$firework->{v_x}*$firework->{timer}; } sub y_t { my $firework=shift; # s=ut+1/2*a*t^2 return $firework->{i_y} - $firework->{timer}* ($firework->{v_y}-5*$firework->{timer}); } sub v_y_t { my $firework=shift; return $firework->{v_y}-10*$firework->{timer} } sub explode { my $firework=shift; $firework->{dead}=1; } sub should_explode { return 0; } 1;