Upload
garux
View
11.646
Download
3
Tags:
Embed Size (px)
DESCRIPTION
Over the past couple of years the SDL Perl bindings have gone through a complete rewrite, making them modular, stable, faster, multiplatform, 1:1 compatible with libsdl and fixing several memory leaks while at it.The community is more alive than ever and now the SDL Perl project is ready to move the Perl motto into gamedev:"Simple games, easy. Complex games, possible."In this talk I'll discuss some of the sugar layers being developed on top of SDL Perl, including game loops, widgets, physics engines and full-fledged frameworks for easy game development.
Citation preview
Game DevelopmentWith Perl and SDL
- press start -
Perl
SDL
Perl
SDL
Perl
SDL
Simple DirectMedia Layer
low level access
Video
Audio
Input Devices
cross-platform
Multimedia App
libSDL
DirectX GDI
MS Windows
framebuffer Xlib
Linux
Quartz
OS X
...
LGPL v2
Round 1
F IGH T!. . .
1:1 API
use strict;use warnings;use SDL;use SDL::Video;use SDL::Surface;use SDL::Rect;
SDL::init(SDL_INIT_VIDEO);my ($screen_w, $screen_h) = (800, 600);my $screen = SDL::Video::set_video_mode( $screen_w, $screen_h, 32, SDL_ANYFORMAT);
my $blue = SDL::Video::map_RGB($screen->format(), 0, 0, 255);SDL::Video::fill_rect( $screen, SDL::Rect->new(15, 15, 100, 100), $blue);SDL::Video::update_rect($screen, 0, 0, $screen_w, $screen_h);
sleep 5; # so we have time to see!
Too low level
Not Perlish at all!
SDLx::* Sugar
use strict;use warnings;
use SDLx::App;
my $app = SDLx::App->new( width => 800, height => 600,);
$app->draw_rect( [15, 15, 100, 100], # rect [0,0,255,255], # blue);
$app->update;
sleep 5; # so we have time to see!
The Game Loop
while ( $running ) { get_events(); update_game(); render_scene();}
while( $running ) { $loops = 0; while( get_tick_count() > $next_game_tick && $loops < $MAX_FRAMESKIP ) { get_events(); update_game();
$next_game_tick += $SKIP_TICKS; $loops++; } $interpolation = ( get_tick_count() + $SKIP_TICKS - $next_game_tick ) / $SKIP_TICKS;
render_scene( $interpolation );}
SDLx::App->run;
use SDLx::App;
my $app = SDLx::App->new;
$app->add_move_handler( \&update );
$app->add_event_handler( \&player_1 );$app->add_event_handler( \&player_2 );
$app->add_show_handler( \&scene );
$app->run;
Avenger
Avenger
sugary syntax
use Avenger title => 'My Game';
update { ... };
show { ... };
event 'key_down' => sub { ... };
event 'mouse_left' => sub { ... };
start;
Box2D
integration
use Avenger title => 'My Game';world->gravity( 0, -100 );
my $player = world->create_dynamic( x => 30, y => 100 );my $floor = world->create_static( y => 50, w => app->w -100 , h => 10,);
update { world->update };
show { app->clear( [0, 0, 0, 255] ); app->draw_rect( $floor->rect, [0, 255, 0, 255] ); app->draw_rect( $player->rect, [255, 50, 0, 255] ); app->update;};
start;
Simple games, easy.
Complex games, possible!
use Avenger;use MyGame;
start 'MainScreen';
package MyGame::MainScreen;use Avenger;
load { ... };
unload { ... };
update { ... };
event { ... };
show { ... };
1;
Other SDLx Goodies
my $menu = SDLx::Widget::Menu->new;
$menu->items( 'New Game' => sub { ... }, 'Load Game' => sub { ... }, 'Options' => sub { ... }, 'Quit' => sub { ... },);
show { $menu->render( app ) };
my $text = SDLx::Text->new( font => '/path/to/my/font.ttf', color => 'white', h_align => 'center', shadow => 1, bold => 1,);
$text->write_to( app, 'All your base are belong to us.');
my $music = SDLx::Music->new;
$music->data( intro => { loops => 3, fade_in => 0.5, volume => 72, }, gameover => { finished => sub { print 'Done!' }, },);
$music->play( 'intro' );
my $sprite = SDLx::Sprite::Animated->new;
$sprite->load( 'hero.png' )->start;
show { $sprite->draw( app ) };
HUGE TODO LIST!