Support for sprite sheets

This commit is contained in:
Ryan Shepherd 2018-09-24 11:18:33 -04:00
parent 8b8c142bdb
commit 4fc7cede49
3 changed files with 68 additions and 19 deletions

View File

@ -11,7 +11,7 @@ use PerlRPG::Game;
use vars qw/%files @ISA @EXPORT @EXPORT_OK/;
@ISA = qw/Exporter/;
@EXPORT = qw/ScanDirectory GetAsset GetAssetType LoadAssets UnloadAsset/;
@EXPORT = qw/ScanDirectory GetAsset GetAssetType LoadAssets UnloadAsset SetAssetOption/;
@EXPORT_OK = ();
# Check %files cache for file location, otherwise search in path
@ -113,6 +113,22 @@ sub UnloadAsset {
}
}
sub SetAssetOption {
my($file, $opt)=@_;
if(!exists $files{$file}) {
FindFile($file);
if(!exists $files{$file}) {
LogData(ERROR, "Unable to find asset '$file' for SetAssetOption");
return undef;
}
}
if($files{$file}{'Loaded'}) {
UnloadAsset($file);
}
$files{$file}{'Opt'} = $opt;
return 1;
}
sub LoadAsset {
my($file, $filename)=@_;
@ -137,15 +153,11 @@ sub LoadAsset {
my($ext)=$file=~/.+\.(.+?)$/;
$ext = lc($ext);
if(grep { $_ eq $ext } (qw/png jpg jpeg bmp/)) {
$files{$file}{'Type'} = 'Sprite';
my $sprite = SDLx::Sprite->new(
image => $files{$file}{'Location'},
);
if(!$sprite) {
LogData(ERROR, "Unable to load sprite '$filename': $!");
return undef;
if($files{$file}{'Opt'} eq 'Animated') {
LoadAnimatedSprite($file, $filename) || return;
} else {
LoadSprite($file, $filename) || return;
}
$files{$file}{'Sprite'} = $sprite;
} elsif($ext eq 'vs') {
unless(open(IN, $filename)) {
LogData(ERROR, "Unable to load '$filename': $!");
@ -174,6 +186,43 @@ sub LoadAsset {
return $files{$file};
}
sub LoadSprite {
my($file, $filename)=@_;
$files{$file}{'Type'} = 'Sprite';
my $sprite = SDLx::Sprite->new(
image => $filename,
);
if(!$sprite) {
LogData(ERROR, "Unable to load sprite '$filename': $!");
return undef;
}
$files{$file}{'Sprite'} = $sprite;
return 1;
}
sub LoadAnimatedSprite {
my($file, $filename)=@_;
$files{$file}{'Type'} = 'ASprite';
my $s1 = SDLx::Sprite->new(
image => $filename,
);
my $surface = $s1->surface();
my $sprite = SDLx::Sprite::Animated->new(
surface => $surface,
width => $surface->width(),
height => $surface->width(),
step_x => $surface->width(),
step_y => $surface->width(),
);
if(!$sprite) {
LogData(ERROR, "Unable to load ASprite '$filename': $!");
return undef;
}
$files{$file}{'ASprite'} = $sprite;
return 1;
}
sub LoadVirtualSprite {
my($name, @files)=@_;

View File

@ -1,8 +1,14 @@
__init__:
SetBackground 128 128 128 255
Show aka aka.vs 0 0 1 type Reverse
Show aka2 aka.vs 100 0 2
SetAssetOption spritesheet.png Animated
drawimg:
Show aka spritesheet.png 0 0 1 type Reverse
#Show aka aka.vs 0 0 1 type Reverse
#Show aka2 aka.vs 100 0 2
Jump donothing
donothing:
Wait
Jump drawimg
Jump donothing

View File

@ -15,12 +15,6 @@ ScanDirectory($asset_directory);
my $app = InitApp($screen_width, $screen_height);
CompileScripts();
RunScript('__init__');
#SetBackgroundColor(128, 128, 128, 255);
#ShowSprite('aka', 'aka.vs', 0, 0, 1);
#ShowSprite('aka2', 'aka.vs', 100, 0, 2);
Run();
LogData(STATUS, "Tearing down");