/examples/pixel_operations/sols/ch02.pl
http://github.com/PerlGameDev/SDL · Perl · 75 lines · 53 code · 22 blank · 0 comment · 13 complexity · 31b3cb388927e77634d71b21522c2198 MD5 · raw file
- package SDL::Tutorial::Sol::Two;
- use strict;
- use warnings;
- use Carp;
- use SDL v2.3;
- use SDL::Video;
- use SDL::Event;
- use SDL::Events;
- use SDL::Surface;
- my $screen;
- sub putpixel {
- my ( $x, $y, $color ) = @_;
- my $lineoffset = $y * ( $screen->pitch / 4 );
- $screen->set_pixels( $lineoffset + $x, $color );
- }
- sub render {
- if ( SDL::Video::MUSTLOCK($screen) ) {
- return if ( SDL::Video::lock_surface($screen) < 0 );
- }
- my $ticks = SDL::get_ticks();
- my ( $i, $y, $yofs, $ofs ) = ( 0, 0, 0, 0 );
- for ( $i = 0; $i < 480; $i++ ) {
- for ( my $j = 0, $ofs = $yofs; $j < 640; $j++, $ofs++ ) {
- $screen->set_pixels( $ofs, ( $i * $i + $j * $j + $ticks ) );
- }
- $yofs += $screen->pitch / 4;
- }
- putpixel( 10, 10, 0xff0000 );
- putpixel( 11, 10, 0xff0000 );
- putpixel( 10, 11, 0xff0000 );
- putpixel( 11, 11, 0xff0000 );
- SDL::Video::unlock_surface($screen) if ( SDL::Video::MUSTLOCK($screen) );
- SDL::Video::update_rect( $screen, 0, 0, 640, 480 );
- return 0;
- }
- sub main {
- Carp::cluck 'Unable to init SDL: ' . SDL::get_error()
- if ( SDL::init(SDL_INIT_VIDEO) < 0 );
- $screen = SDL::Video::set_video_mode( 640, 480, 32, SDL_SWSURFACE );
- Carp::cluck 'Unable to set 640x480x32 video' . SDL::get_error() if ( !$screen );
- while (1) {
- render();
- my $event = SDL::Event->new();
- while ( SDL::Events::poll_event($event) ) {
- my $type = $event->type;
- return 0 if ( $type == SDL_KEYDOWN );
- return 0 if ( $type == SDL_QUIT );
- }
- SDL::Events::pump_events();
- }
- }
- main;
- SDL::quit;