NAME

SDLx::Controller - Handles the loops for event, movement and rendering

SYNOPSIS

  use SDLx::Controller

  # create our controller object
  my $app = SDLx::Controller->new;

  # register some callbacks
  $app->add_event_handler( \&on_event );
  $app->add_move_handler( \&on_move );
  $app->add_show_handler( \&on_show );

  # run our game loop
  $app->run;

DESCRIPTION

The core of a SDL application/game is the main loop, where you handle events and display your elements on the screen until something signals the end of the program. This usually goes in the form of:

  while (1) {
      ...
  }

The problem most developers face, besides the repetitive work, is to ensure the screen update is independent of the frame rate. Otherwise, your game will run at different speeds on different machines and this is never good (old MS-DOS games, anyone?).

One way to circumveint this is by capping the frame rate so it's the same no matter what, but this is not the right way to do it as it penalizes better hardware.

This module provides an industry-proven standard for frame independent movement. It calls the movement handlers based on time (tick counts) rather than frame rate. You can add/remove handlers and control your main loop with ease.

METHODS

new

new( dt => 0.5 )

Controller construction. Optional dt parameter indicates delta t times in which to call the movement handlers, and defaults to 0.1.

Returns the new object.

run

After creating and setting up your handlers (see below), call this method to activate the main loop. The main loop will run until an event handler returns undef.

All hooked functions will be called during the main loop, in this order:

1. Events
2. Movements
3. Displaying

Please refer to each handler below for information on received arguments.

add_event_handler

Register a callback to handle events. You can add as many subs as you need. Whenever a SDL::Event occurs, all registered callbacks will be triggered in order. Returns the order queue number of the added callback.

The first (and only) argument passed to registered callbacks is the SDL::Event object itself, so you can test for $event->type, etc.

Each event handler is required to return a defined value for the main loop to continue. To exit the main loop (see "run" above), return undef or nothing at all.

add_move_handler

Register a callback to update your objects. You can add as many subs as you need. Returns the order queue number of the added callback.

All registered callbacks will be triggered in order for as many dt as have happened between calls. You should use these handlers to update your in-game objects, check collisions, etc.

The first (and only) argument passed is a reference to the dt value itself, so you can check and/or update it as necessary.

Any returned values are ignored.

add_show_handler

Register a callback to render objects. You can add as many subs as you need. Returns the order queue number of the added callback.

All registered callbacks will be triggered in order, once per run of the main loop. The first (and only) argument passed is the number of ticks since the previous round.

quit

Exits the main loop. Calling this method will cause run to return.

remove_move_handler( $index )

remove_event_handler( $index )

remove_show_handler( $index )

Removes the handler with the given index from the respective calling queue.

You can also pass a coderef. The first coderef in the handler list that this matches will be removed.

Returns the removed handler.

remove_all_move_handlers

remove_all_event_handlers

remove_all_show_handlers

Removes all handlers from the respective calling queue.

remove_all_handlers

Quick access to removing all handlers at once.

AUTHORS

Kartik Thakore

Breno G. de Oliveira

ACKNOWLEGDEMENTS

The idea and base for this module comes from Lazy Foo's Frame Independent Movement tutorial, and Glenn Fiedler's Fix Your Timestep article on timing.