From 4fc7cede49f7a65500ea0086f726602eb7bb6a85 Mon Sep 17 00:00:00 2001 From: Ryan Shepherd Date: Mon, 24 Sep 2018 11:18:33 -0400 Subject: [PATCH] Support for sprite sheets --- PerlRPG/Assets.pm | 67 +++++++++++++++++++++++++++++++++++++++------ Resources/script.gs | 14 +++++++--- main.pl | 6 ---- 3 files changed, 68 insertions(+), 19 deletions(-) diff --git a/PerlRPG/Assets.pm b/PerlRPG/Assets.pm index 10d7c99..5d4895a 100644 --- a/PerlRPG/Assets.pm +++ b/PerlRPG/Assets.pm @@ -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)=@_; diff --git a/Resources/script.gs b/Resources/script.gs index 465c8e1..87e38d4 100644 --- a/Resources/script.gs +++ b/Resources/script.gs @@ -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 diff --git a/main.pl b/main.pl index 3362ad5..e54d1ff 100755 --- a/main.pl +++ b/main.pl @@ -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");