104 lines
2.1 KiB
Perl
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;
|