use SDL::Event;
use Math::CatmullRom;
use Algorithm::Line::Bresenham qw(line);
+use Math::Bezier;
use Carp qw(cluck);
use Data::Dump qw(dump);
+use Airplane;
+our @airplanes;
+
our $debug = 0;
my ( $w, $h ) = ( 800, 480 );
our @path;
sub reset_path { @path = () }
-sub curve {
-
- push @path, lading_points( $path[-2], $path[-1] ) if $#path > 1;
+sub curve_catmull_rom {
if ( $#path < ( 4 * 2 - 1 ) ) { # less than 4 points
warn "path too short ", dump @path;
my $curve = Math::CatmullRom->new( @path );
my $points = $#path + 1 - 4; # remove start/end points
- my @curve = $curve->curve( $points );
+ return $curve->curve( $points );
+}
+
+sub curve_bezier {
+ my $curve = Math::Bezier->new( @path );
+ return $curve->curve( $#path + 1 );
+}
+
+our $curve_type = 0;
+
+sub curve {
+ # add landing path points
+ push @path, lading_points( $path[-2], $path[-1] ) if $#path > 1;
+
+ my $type = 1;
+
+ my @curve = $curve_type ? curve_catmull_rom : curve_bezier;
debug 'curve' => @curve;
my $i = 0;
);
}
$app->sync;
+
+ push @airplanes, Airplane->new( $app );
+ $airplanes[-1]->set_path( @curve );
reset_path;
}
sub handle_events {
- while ( $event->wait ) {
+ while ( $event->poll ) {
my $type = $event->type();
if ( $type == SDL_MOUSEBUTTONDOWN() ) {
} elsif ( $type == SDL_MOUSEBUTTONUP() ) {
debug 'mouse up', $event->button_x, $event->button_y;
$mouse_down = 0;
-
curve;
} elsif ( $type == SDL_QUIT() ) {
exit;
$current_mask++;
$current_mask = 0 if $current_mask > $#masks;
clear_screen $current_mask;
+ } elsif ( $key eq 't' ) { # XXX curve type
+ $curve_type = ! $curve_type;
} else {
warn "unknown key $key";
}
$app->fill( $rect, $mouse_color );
$app->update( $rect );
$last_x = $x;
- $last_y = $y;
+ $last_y = $y;
} else {
$mouse_down = 0;
curve;
while(1) {
handle_events;
+ $_->draw foreach @airplanes;
+ $app->delay(50);
$app->sync;
- $app->delay(1);
}
1;