The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use SDL;
use SDL::Rect;
use SDL::Event;
use SDL::Events;
use SDL::Image;
use SDL::Surface;
use SDLx::Surface;
use SDLx::App;

my $app = SDLx::App->new( -width => 300, -height => 400, -depth => 32 );

my $quit  = 0;
my $rot   = 0;
my $event = SDL::Event->new();
my @stars = ();

foreach ( 0 .. 40 ) {
    my $x     = rand( $app->w );
    my $y     = rand( $app->h );
    my $speed = rand(4) + 1;

    push( @stars, { x => $x, y => $y, speed => $speed } );
}

my $display_matrix = SDLx::Surface->new( surface => $app );

#foreach(0..300)
while (1) {

    SDL::Events::pump_events();
    while ( SDL::Events::poll_event($event) ) {
        $quit = 1 if $event->type == SDL_QUIT;
        if ( $event->type == SDL_KEYDOWN
            || ( $event->key_sym && $event->type != SDL_KEYUP ) )
        {
            $rot += 0.1 if $event->key_sym == SDLK_UP;
            $rot -= 0.1 if $event->key_sym == SDLK_DOWN;

        }
    }

    my @update_rects = ();

    foreach (@stars) {

        $display_matrix->[ $_->{x} ][ $_->{y} ] = 0xFF000000;

        $_->{x} += $_->{speed};
        $_->{y} += $_->{speed} * $rot;
        $_->{x} = 0       if ( $_->{x} >= $app->w );
        $_->{y} = 0       if ( $_->{y} >= $app->h );
        $_->{x} = $app->w if ( $_->{x} < 0 );
        $_->{y} = $app->h if ( $_->{y} < 0 );

        $display_matrix->[ $_->{x} ][ $_->{y} ] = 0xFFFFFFFF;

        #		push @update_rects, SDL::Rect->new($_->{x}, $_->{y}, 2, 2);

    }

    $display_matrix->update();

}