<ul><li><a href="#CATEGORY">CATEGORY</a></li>
</ul>
</li>
-<li><a href="#Old_SDL_interface">Old SDL interface</a></li>
<li><a href="#Perl_s_SDL_in_a_nutshell">Perl's SDL in a nutshell</a></li>
<li><a href="#SDL_power_through_simplicity">SDL - power through simplicity</a></li>
<li><a href="#Example_1_Model_of_a_2_D_Noninteract">Example 1: Model of a 2-D Noninteracting Gas</a>
<p>Cookbook</p>
</div>
-<h1 id="Old_SDL_interface">Old SDL interface</h1><p><a href="#TOP" class="toplink">Top</a></p>
-<div id="Old_SDL_interface_CONTENT">
-<p>Please be aware that much of the code in this example uses SDL Perl v 2.2.4. The SDL Perl developers are hard at work rewriting SDL, to be released as SDL 3.0 soon. The new version of SDL is not backwards compatible. Check back with this page after SDL 3.0 has been released to get the updated commands.</p>
-
-</div>
<h1 id="Perl_s_SDL_in_a_nutshell">Perl's SDL in a nutshell</h1><p><a href="#TOP" class="toplink">Top</a></p>
<div id="Perl_s_SDL_in_a_nutshell_CONTENT">
<p>SDL stands for Simple DirectMedia Layer. It's a cross-platform library written in C that's meant to handle all of the low-level graphics and sound stuff. You can read more about SDL here: http://www.libsdl.org/. Because SDL is focused on game programming, it has a raw but clean feel to it. We will focus for now on using SDL to handle images for us. Handling sound may some day be the focus of another chapter.</p>
use SDL::App;
use SDL::Rect;
use SDL::Color;
+ use SDL::Video;
# User defined pen-nib size.
my $nib_size = 3;
# our nib will be white
my $nib_color = SDL::Color->new(
- -r => 0xff,
- -g => 0xff,
- -b => 0xff,
+ 0xff, #r
+ 0xff, #b
+ 0xff, #g
);
# and our nib will be represented by a rectangle
# (Alternatively, you could use an image, which would allow
# for pretty anti-aliasing if you created it in GIMP with
# antialiasing)
- my $nib = SDL::Rect->new(
- -height => $nib_size,
- -width => $nib_size,
+ my $nib = SDL::Rect->new(
+ 0 , 0, #x, y
+ $nib_size, #w
+ $nib_size, #h
);
# now draw a sine wave (wthout covering up previously drawn rectangles)
$nib->x( $t * 8 );
$nib->y( sin($t) * 80 + 240 );
- $app->fill( $nib, $nib_color );
+ SDL::Video::fill_rect($app, $nib, $nib_color );
}
# Generally use the update command, but if you want to update the whole
# surface, use flip
- $app->flip()
+ SDL::Video::fill_rect($app,)
sleep 5;
use SDL::App;
use SDL::Rect;
use SDL::Color;
+ use SDL::Video;
# Create the SDL App
my $app = SDL::App->new( -width => $side_length, -height => $side_length,
-title => "Simple Simulation!", -depth => 16, );
# white particles on a black background
- my $particle_color = SDL::Color->new( -r => 0xff, -g => 0xff, -b => 0xff, );
- my $bg_color = SDL::Color->new( -r => 0x00, -g => 0x00, -b => 0x00, );
+ my $particle_color = SDL::Color->new( 0xff, 0xff, 0xff, );
+ my $bg_color = SDL::Color->new( 0x00, 0x00, 0x00 );
# rectangles for the particles and the background
- my $particle = SDL::Rect->new( -height => 5, -width => 5, );
- my $bg = SDL::Rect->new( -height => $side_length, -width => $side_length, );
+ my $particle = SDL::Rect->new( 0,0, 5, 5);
+ my $bg = SDL::Rect->new( 0,0,$side_length, $side_length, );
</pre>
<p>Hopefully this is straightforward code. We pull in our library dependencies and then create a few objects with the necessary properties. Finally, we get to the actual application loop:</p>
compute();
# Clean the canvas
- $app->fill( $bg, $bg_color);
+ SDL::Video::fill_rect($app, $bg, $bg_color);
for(my $i = 0; $i < $numb_of_atoms; $i++) {
$particle->x( $positions->at(0,$i) );
$particle->y( $positions->at(1,$i) );
- $app->fill( $particle, $particle_color );
+ SDL::Video::fill_rect($app, $particle, $particle_color );
}
- $app->flip();
+ SDL::Video::flip($app);
$app->delay(10);
}
<pre> for(my $i = 0; $i < $numb_of_atoms; $i++) {
$particle->x( $positions->at(0,$i) );
$particle->y( $positions->at(1,$i) );
- $particle->height( $particle_size );
- $particle->width( $particle_size );
- $app->fill( $particle, $particle_color );
+ $particle->h( $particle_size );
+ $particle->w( $particle_size );
+ SDL::Video::fill_rect($app, $particle, $particle_color );
}
</pre>
use SDL::App;
use SDL::Rect;
use SDL::Color;
+ use SDL::Video;
# Create the SDL App
my $app = SDL::App->new( -width => $side_length, -height => $side_length,
-title => "Simple Simulation!", -depth => 16, );
# white particles on a black background
- my $particle_color = SDL::Color->new( -r => 0xff, -g => 0xff, -b => 0xff, );
- my $bg_color = SDL::Color->new( -r => 0x00, -g => 0x00, -b => 0x00, );
+ my $particle_color = SDL::Color->new( 0xff, 0xff, 0xff, );
+ my $bg_color = SDL::Color->new( 0x00, 0x00, 0x00 );
# rectangles for the particles and the background
- my $particle = SDL::Rect->new( -height => 5, -width => 5, );
- my $bg = SDL::Rect->new( -height => $side_length, -width => $side_length, );
+ my $particle = SDL::Rect->new( 0,0, 5, 5);
+ my $bg = SDL::Rect->new( 0,0,$side_length, $side_length, );
# Run the simulation
for(my $t = 0; $t < 20; $t += $d_t) {
MyCompute::compute();
# Clean the canvas
- $app->fill( $bg, $bg_color);
+ SDL::Video::fill_rect($app, $bg, $bg_color);
for(my $i = 0; $i < $numb_of_atoms; $i++) {
$particle->x( $positions->at(0,$i) );
$particle->y( $positions->at(1,$i) );
- $app->fill( $particle, $particle_color );
+ SDL::Video::fill_rect($app, $particle, $particle_color );
}
- $app->flip();
+ SDL::Video::flip($app);
$app->delay(10);
}
<h2 id="Listening_to_Events">Listening to Events</h2>
<div id="Listening_to_Events_CONTENT">
<p>To respond to user interactions, we have to listen to user events using an SDL::Event object. So first, add this line with our other use statements:</p>
-<pre> use SDL::Event;
+<pre> use SDL::Event;
+ use SDL::Events;
</pre>
<p>and then be sure to create an event object amongst the animation initialization code:</p>
MyCompute::compute();
# Clean the canvas
- $app->fill( $bg, $bg_color);
+ SDL::Video::fill_rect($app, $bg, $bg_color);
for(my $i = 0; $i < $numb_of_atoms; $i++) {
$particle->x( $positions->at(0,$i) );
$particle->y( $positions->at(1,$i) );
- $app->fill( $particle, $particle_col10);
+ SDL::Video::fill_rect($app, $particle, $particle_col10);
- while($event->poll()) {
- if($event->type() =head1 SDL_QUIT) {
+ while(SDL::Events::poll_event($event) ) {
+ if($event->type() == SDL_QUIT) {
exit;
}
}
sub incr_particle_size {
$particle_size++;
- $particle->height($particle_size);
- $particle->width($particle_size);
+ $particle->h($particle_size);
+ $particle->w($particle_size);
}
sub decr_particle_size {
$particle_size-- if $particle_size > 1;
- $particle->height($particle_size);
- $particle->width($particle_size);
+ $particle->h($particle_size);
+ $particle->w($particle_size);
}
MyCompute::compute();
# Clean the canvas
- $app->fill( $bg, $bg_color);
+ SDL::Video::fill_rect($app, $bg, $bg_color);
for(my $i = 0; $i < $numb_of_atoms; $i++) {
$particle->x( $positions->at(0,$i) );
$particle->y( $positions->at(1,$i) );
- $app->fill( $particle, $particle_color );
+ SDL::Video::fill_rect($app, $particle, $particle_color );
}
- $app->flip();
+ SDL::Video::flip($app);
$app->delay(10);
- while($event->poll()) {
- if($event->type() =head1 SDL_QUIT) {
+ while(SDL::Events::poll_event($event) ) {
+ if($event->type() == SDL_QUIT) {
exit;
- } elsif($event->type() =head1 SDL_KEYDOWN) {
- if(exists $keyname_dispatch_table->{$event->key_name()}) {
- $keyname_dispatch_table->{$event->key_name()}->();
+ } elsif($event->type() == SDL_QUIT) {
+ if(exists $keyname_dispatch_table->{$event->keysym_name()}) {
+ $keyname_dispatch_table->{$event->keysym_name()}->();
}
}
}
use SDL::App;
use SDL::Rect;
use SDL::Color;
- use SDL::Event;
+ use SDL::Video;
+ use SDL::Event;
+ use SDL::Events;
# Create the SDL App
my $app = SDL::App->new( -width => $side_length, -height => $side_length,
-title => "Simple Simulation!", -depth => 16, );
# white particles on a black background
- my $particle_color = SDL::Color->new( -r => 0xff, -g => 0xff, -b => 0xff, );
- my $bg_color = SDL::Color->new( -r => 0x00, -g => 0x00, -b => 0x00, );
+ my $particle_color = SDL::Color->new( 0xff, 0xff, 0xff, );
+ my $bg_color = SDL::Color->new( 0x00, 0x00, 0x00 );
# rectangles for the particles and the background
- my $particle = SDL::Rect->new( -height => 5, -width => 5, );
- my $bg = SDL::Rect->new( -height => $side_length, -width => $side_length, );
+ my $particle = SDL::Rect->new( 0,0, 5, 5);
+ my $bg = SDL::Rect->new( 0,0,$side_length, $side_length, );
# event listener
- my $event = new SDL::Event;
+ my $event = new SDL::Event->new();
# event dispatch table
my $keyname_dispatch_table = {
sub incr_particle_size {
$particle_size++;
- $particle->height($particle_size);
- $particle->width($particle_size);
+ $particle->h($particle_size);
+ $particle->w($particle_size);
}
sub decr_particle_size {
$particle_size-- if $particle_size > 1;
- $particle->height($particle_size);
- $particle->width($particle_size);
+ $particle->h($particle_size);
+ $particle->w($particle_size);
}
MyCompute::compute();
# Clean the canvas
- $app->fill( $bg, $bg_color);
+ SDL::Video::fill_rect($app, $bg, $bg_color);
for(my $i = 0; $i < $numb_of_atoms; $i++) {
$particle->x( $positions->at(0,$i) );
$particle->y( $positions->at(1,$i) );
- $app->fill( $particle, $particle_color );
+ SDL::Video::fill_rect($app, $particle, $particle_color );
}
- $app->flip();
+ SDL::Video::flip($app);
$app->delay(10);
- while($event->poll()) {
- if($event->type() =head1 SDL_QUIT) {
+ while(SDL::Events::poll_event($event) ) {
+ if($event->type() == SDL_QUIT) {
exit;
- } elsif($event->type() =head1 SDL_KEYDOWN) {
- if(exists $keyname_dispatch_table->{$event->key_name()}) {
- $keyname_dispatch_table->{$event->key_name()}->();
+ } elsif($event->type() == SDL_QUIT) {
+ if(exists $keyname_dispatch_table->{$event->keysym_name()}) {
+ $keyname_dispatch_table->{$event->keysym_name()}->();
}
}
}
<ul><li><a href="#NAME">NAME</a>
<ul><li><a href="#CATEGORY">CATEGORY</a></li>
<li><a href="#First_Steps">First Steps</a>
-<ul><li><a href="#Overview">Overview</a></li>
-<li><a href="#Installation">Installation</a></li>
-<li><a href="#Tutorial">Tutorial</a></li>
-</ul>
-</li>
-<li><a href="#Core_SDL_Layer">Core SDL Layer</a>
-<ul><li><a href="#Video">Video</a></li>
-<li><a href="#Events">Events</a></li>
-</ul>
-</li>
-<li><a href="#Audio">Audio </a>
-<ul><li><a href="#Mixer">Mixer</a></li>
-</ul>
-</li>
-<li><a href="#Images">Images </a>
-<ul><li><a href="#BMP">BMP</a></li>
-<li><a href="#Image_extensions">Image extensions</a></li>
-</ul>
-</li>
-<li><a href="#Text">Text</a>
-<ul><li><a href="#TTF">TTF</a></li>
-<li><a href="#Pango">Pango</a></li>
-</ul>
-</li>
-<li><a href="#Extras">Extras</a>
-<ul><li><a href="#GFX">GFX</a></li>
-<li><a href="#OpenGL">OpenGL</a>
-</li>
-</ul>
</li>
</ul>
</li>
</div>
<h2 id="First_Steps">First Steps</h2>
<div id="First_Steps_CONTENT">
-
-</div>
-<h3 id="Overview">Overview</h3>
-<div id="Overview_CONTENT">
-
-</div>
-<h3 id="Installation">Installation</h3>
-<div id="Installation_CONTENT">
-
-</div>
-<h3 id="Tutorial">Tutorial</h3>
-<div id="Tutorial_CONTENT">
-
-</div>
-<h2 id="Core_SDL_Layer">Core SDL Layer</h2>
-<div id="Core_SDL_Layer_CONTENT">
-
-</div>
-<h3 id="Video">Video</h3>
-<div id="Video_CONTENT">
-
-</div>
-<h3 id="Events">Events</h3>
-<div id="Events_CONTENT">
-
-</div>
-<h2 id="Audio">Audio </h2>
-<div id="Audio_CONTENT">
-
-</div>
-<h3 id="Mixer">Mixer</h3>
-<div id="Mixer_CONTENT">
-
-</div>
-<h2 id="Images">Images </h2>
-<div id="Images_CONTENT">
-
-</div>
-<h3 id="BMP">BMP</h3>
-<div id="BMP_CONTENT">
-
-</div>
-<h3 id="Image_extensions">Image extensions</h3>
-<div id="Image_extensions_CONTENT">
-
-</div>
-<h2 id="Text">Text</h2>
-<div id="Text_CONTENT">
-
-</div>
-<h3 id="TTF">TTF</h3>
-<div id="TTF_CONTENT">
-
-</div>
-<h3 id="Pango">Pango</h3>
-<div id="Pango_CONTENT">
-
-</div>
-<h2 id="Extras">Extras</h2>
-<div id="Extras_CONTENT">
-
-</div>
-<h3 id="GFX">GFX</h3>
-<div id="GFX_CONTENT">
-
-</div>
-<h3 id="OpenGL">OpenGL</h3>
-<div id="OpenGL_CONTENT">
-
-
-
-
-
-
-
-
-
-
-
-
-
+<p>see <a href="SDL-Tutorial.html">SDL::Tutorial</a>
+</p>
</div>
</div>
\ No newline at end of file
<div id="USING_SDL_CONTENT">
<p>First step: use the required libraries:</p>
<p> </p>
-<pre> use SDL; #needed to get all constants
- use SDL::App;
- use SDL::Surface;
- use SDL::Rect;
+<pre> use SDL; #needed to get all constants
+ use SDL::Video;
+ use SDL::App;
+ use SDL::Surface;
+ use SDL::Rect;
+ use SDL::Image;
</pre>
<p> </p>
<p> </p>
<p>Third step: load the images and create the necessary "rectangles":</p>
<p> </p>
-<pre> my $background = SDL::Surface->new( -name => 'images/background.jpg', );
- my $ship = SDL::Surface->new( -name => 'images/ship.png', );
+<pre> my $background = SDL::Image::load('images/background.jpg');
+ my $ship = SDL::Image::load('images/ship.jpg');
- my $background_rect = SDL::Rect->new(
- -height => $background->height(),
- -width => $background->width(),
- );
+ my $background_rect = SDL::Rect->new(0,0,
+ $background->w,
+ $background->h,
+ );
- my $ship_rect = SDL::Rect->new(
- -height => $ship->height(),
- -width => $ship->width(),
- );
+ my $ship_rect = SDL::Rect->new(0,0,
+ $ship->w,
+ $ship->h,
+ );
</pre>
<p> </p>
<p>Fourth step: create a sub to draw the spaceship and background:</p>
<p> </p>
-<pre> sub draw {
- my ( $x, $y ) = @_; # spaceship position
+<pre> sub draw {
+ my ( $x, $y ) = @_; # spaceship position
- # fix $y for screen resolution
- $y = 450 * ( 1000 - $y ) / 1000;
+ # fix $y for screen resolution
+ $y = 450 * ( 1000 - $y ) / 1000;
- # background
- $background->blit( $background_rect, $app, $background_rect );
+ # background
+ SDL::Video::blit_surface($background, $background_rect, $app, $background_rect );
- # ship
- my $ship_dest_rect = SDL::Rect->new(
- -height => $ship->height(),
- -width => $ship->width(),
- -x => $x,
- -y => $y,
- );
+ # ship
+ my $ship_dest_rect = SDL::Rect->new(
+ $x, $y, $ship->w, $ship->h,
+ );
- $ship->blit( $ship_rect, $app, $ship_dest_rect );
+ SDL::Video::blit_surface($ship, $ship_rect, $app, $ship_dest_rect );
- $app->update($background_rect);
- }
+ SDL::Video::update_rects($app, $background_rect);
+ }
</pre>
<p> </p>