=head1 NAME Game::Event::Timed - Time events =head1 SYNOPSIS Nah... =cut package Game::Event::Timed; use strict; use Data::Dumper; use Time::HiRes qw( time ); =head1 PROPERTIES =head2 timeNextTick The time the next tick should occur, or undef if no tick should occur. Default: undef =cut use Class::MethodMaker get_set => [ "timeNextTick" ]; =head2 timeInterval The time between ticks, or undef if there is no interval When set, it doesn't reset the current timeNextTick, it is used after the _next_ tick. Default: undef =cut use Class::MethodMaker get_set => [ "timeInterval" ]; =pod sub timeInterval { my $self = shift; if(@_) { $self->{timeInterval} = $_[0]; if(defined( $self->{timeInterval} )) { $self->timeNextTick( time() + $self->{timeInterval} ); } else { $self->timeNextTick(undef); } } return($self->{timeInterval}); } =cut =head1 METHODS =head2 new([$interval]) Create new timed object. =cut sub new { my $pkg = shift; my ($timeInterval) = @_; my $self = {}; bless $self, $pkg; $self->timeNextTick(undef); $self->timeInterval($timeInterval); return($self); } =head2 checkTick($timeWorld) Check if a tick is due. Return 1 if a tick was due, else 0. =cut sub checkTick { my $self = shift; my ($timeWorld) = @_; #Is it the first time with an interval? if(!defined($self->timeNextTick)) { if(defined($self->timeInterval)) { $self->timeNextTick( $timeWorld + $self->timeInterval ); } } if(defined($self->timeNextTick)) { if($timeWorld >= $self->timeNextTick) { if(defined($self->timeInterval)) { $self->timeNextTick( $timeWorld + $self->timeInterval ); } else { $self->timeNextTick(undef); } return(1); } } return(0); } 1; #EOF