#the function #screen is a SDL_App, $image a SDL_Image, $x $y $yoff $xoff are just position and offsets. sub prone_image_copy($$$$;$$) { my ( $screen,$image,$x,$y,$xoff,$yoff ) = @_; if( !defined( $xoff ) ) { $xoff = 0; } if( !defined( $yoff ) ) { $yoff = 0; } my $image_rect = SDL::Rect->new( -height => $image->height(), -width => $image->width(), -x => 0, -y => 0, ); my $tx = ( $x + $xoff ) ; my $ty = ( $y + $yoff ) ; my $dest_rect = SDL::Rect->new( -height => $image->height(), -width => $image->width(), -x => $tx , -y => $ty , ); $image->blit( $image_rect, $screen, $dest_rect ); return 0; } #here is a snippet of my code using it , I guess optimisations should go there. #min_* and max_* are tiles coords to show at least and at max #$map is a 2 dimensional array holding references to some objects holding the tiles #I try to have 20 fps so that code should not run more that 50ms, it currently take around 100 :\ for( my $i = $min_x -1;$i< $max_x +1 ;$i++ ) { for ( my $j = $min_y -1 ;$j< $max_y +1 ;$j++ ) { if( $i <= 29 and $i >= 0 and $j >=0 and $j <29 ) { #animate stuff if( $update > 0.1 ) { $map[$i][$j]->anim; } $imgname = $map[$i][$j]->img ; #copy a tile #$screen = prone_image_copy( $screen,$imgs->{$imgname},$i*32,$j*32,$xoff,$yoff ); } } }