PerlRPG/PerlRPG/Game.pm

104 lines
2.1 KiB
Perl

package PerlRPG::Game;
use strict;
require Exporter;
use SDL;
use SDL::Event;
use SDLx::App;
use SDLx::Sprite;
use SDLx::Sprite::Animated;
use PerlRPG::Console;
use PerlRPG::Assets;
use PerlRPG::Drawing;
use PerlRPG::Script;
use PerlRPG::Controls;
use vars qw/$app @ISA @EXPORT @EXPORT_OK/;
@ISA = qw/Exporter/;
@EXPORT = qw/InitApp Run RunScript GetOption SetOption/;
@EXPORT_OK = @EXPORT;
$app = undef;
my %opt = (
'App' => undef,
'Running' => 1,
'TargetFPS' => 5,
'ResourceDir' => '.',
'Status' => 'WaitForFrame',
);
sub GetOption { return (exists $opt{$_[0]} ? $opt{$_[0]} : undef); }
sub SetOption { $opt{$_[0]} = $_[1]; }
sub InitApp {
my($width, $height)=@_;
return undef if($app);
LogData(INFO, "Creating SDL instance");
$app = SDLx::App->new(
width => $width,
height => $height,
);
$opt{'App'}=$app;
LogData(DEBUG, "SDL Instance created");
return $app;
}
sub Run {
my $tick = SDL::get_ticks();
while($opt{'Running'}) {
EventDispatcher();
RunScriptTick();
RenderScreen();
my $ticktime = SDL::get_ticks() - $tick;
my $delta = 1000/$opt{'TargetFPS'} - $ticktime;
LogData(DEVALL, "TickTime = $ticktime, Delta = $delta");
SDL::delay($delta) if($delta > 0);
$tick = SDL::get_ticks();
}
}
sub EventDispatcher {
my $event = SDL::Event->new();
SDL::Events::pump_events();
while(SDL::Events::poll_event($event)) {
if($event->type == SDL_KEYDOWN) {
my $key = SDL::Events::get_key_name($event->key_sym);
KeyPressed($key, 'down', SDL::Events::get_mod_state());
} elsif($event->type == SDL_KEYUP) {
my $key = SDL::Events::get_key_name($event->key_sym);
KeyPressed($key, 'up', SDL::Events::get_mod_state());
} elsif($event->type == SDL_MOUSEBUTTONDOWN) {
MouseClick( $event->button_x,
$event->button_y,
$event->button_button,
'down',
SDL::Events::get_mod_state()
);
} elsif($event->type == SDL_MOUSEBUTTONUP) {
MouseClick( $event->button_x,
$event->button_y,
$event->button_button,
'up',
SDL::Events::get_mod_state()
);
} elsif($event->type == SDL_QUIT) {
$opt{'Running'} = 0;
}
}
}
sub RenderScreen {
RenderSprites();
$app->update();
}
sub RunScript {
}
1;