SO hopefully this is the last question I will ever have to ask regarding pong in SDL. Everything works now except the paddles start in the the upper corners instead of the center and I dont understand the movement of them. I understand where the block of code is thats moving them, but they don't move very far and after I let go of the up or down arrow they snap back up to their orginal position. Them being in the upper corners of the screen isnt that big of a deal, but them not moving correctly is. If anyone knows what I need to change to have them move more than half an inch it would be greatly appreciated. The specific block that allows the arrow keys to move the paddles starts with '$app->add_event_handler'

#!/usr/bin/perl use strict; use warnings; # These will allow us to use all the modules necessary to create a GUI +. # They are all parts of the Perl SDL module. # The :: are use to seperate the name of the module and its correspond +ing member. use SDL; use SDL::Events; use SDLx::App; use SDLX::Rect; # First is to set up the screen. # The => operator is similiar to a comma. # but it treates the word to the left as a quoted word. # Even though there isn't any quotes. my $app = SDLx::App->new( width => 500, height => 500, title => 'PONG', dt => 0.04, exit_on_quit => 1, ); # The next step is to set up the paddles for each player. # This is done in a hash reference. # This is done so its possible to add information later. # The numbers may need to be changed later to fit the paddles to the s +creen. # I am not 100% sure what -> actually does. # Other than the fact its a deference operator. # h is a shortened reference to height my $player1 = { paddle => SDLx::Rect->new( 10, $app-> height / 2, 10, 40), }; my $player2 = { paddle => SDLx::Rect->new( $app-> width - 20, $app-> height / 2, 1 +0, 40) }; # This is to create the ball my $ball = { rect => SDLx::Rect->new( $app-> width / 2, $app-> height / 2, 10, +10 ), v_x => -2.3, v_y => 1.5, }; $app->add_show_handler ( sub { $app->draw_rect( [ 0, 0, $app->w, $app->h ], 0x000000FF ); $app->draw_rect( $ball->{rect}, 0xFF0000FF ); $app->draw_rect( $player1->{paddle}, 0xFF0000FF ); $app->draw_rect( $player2->{paddle}, 0xFF0000FF ); $app->update; } ); $player1 = { paddle => SDLx::Rect->new( 10, $app-> height / 2, 10, 40 ), v_y => 0, }; $app->add_move_handler( sub { my ( $step, $app ) = @_; my $paddle = $player1->{paddle}; my $v_y = $player1->{v_y}; $paddle->y( $paddle->y ( $v_y * $step ) ); }); $player2 = { paddle => SDLx::Rect->new( $app->w - 20, $app-> height / 2, 10, 40 +), v_y => 0, }; $app->add_move_handler( sub { my ( $step, $app ) = @_; my $paddle = $player2->{paddle}; my $v_y = $player2->{v_y}; if ( $ball->{rect}->y > $paddle->y ) { $player2->{v_y} =1.5; } else { $player2->{v_y} = 0; } $paddle->y( $paddle->y ( $v_y * $step ) ); }); $app->add_event_handler( sub { my ( $event, $app ) = @_; if ( $event->type == SDL_KEYDOWN ) { if ( $event->key_sym == SDLK_UP ) { $player1->{v_y} = -20; } elsif ( $event->key_sym == SDLK_DOWN ) { $player1->{v_y} = 20; } } elsif ( $event->type == SDL_KEYUP ) { if ( $event->key_sym == SDLK_UP or $event->key_sym == SDLK_DOWN ) { $player1->{v_y} = 0; } } } ); $app->add_move_handler( sub { my ( $step, $app ) = @_; my $ball_rect = $ball->{rect}; $ball_rect->x( $ball_rect->x + ($ball->{v_x} * $step) ); $ball_rect->y( $ball_rect->y + ($ball->{v_y} * $step) ); if ( $ball_rect->bottom >= $app->h ) { $ball_rect->bottom( $app->h); $ball->{v_y} *= -1; } elsif ( $ball_rect->top <= 0 ) { $ball_rect->top( 0 ); $ball->{v_y} *= -1; } elsif ( $ball_rect->right >= $app->w ) { $player1->{score}++; reset_game(); return; } elsif ( $ball_rect->left <= 0 ) { $player2->{score}++; reset_game(); return; } elsif ( check_collision( $ball_rect, $player1->{paddle} )) { $ball_rect->left( $player1->{paddle}->right ); $ball->{v_x} *= -1; } elsif ( check_collision( $ball_rect, $player2->{paddle} )) { $ball->{v_x} *= -1; $ball_rect->right( $player2->{paddle}->left ); } }); sub reset_game { $ball->{rect}->x( $app->w / 2 ); $ball->{rect}->y( $app->h / 2); } sub check_collision { my ($A, $B) = @_; return if $A->bottom < $B->top; return if $A->top > $B->bottom; return if $A->right < $B->left; return of $A->left > $B->right; return 1; } $app->run;

In reply to Movement handlers in SDL by drose2211

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.