koji::*

主に技術系。他に雑多なことをアレコレと

perlのSDLではまっている途中(解決済み)。

※問題解決したサンプルコードは一番下に記述しました。

SDLperlバインディングを触ってみようかと思い立ってみたのですが
未だにサンプルすら動かない有様です。

そろそろ潮時感が出てきたので、
動かないなりに、やったことを書き残してみます。

試した環境:
Mac Book Pro
Mac OS X 10.6.8
perl-5.14.1(perlbrew)
SDL 2.533

インストール手順はこんな感じ。
SDL_Manualに書かれていた手順はcpanでインストールしてましたが、
一応、cpanmとcpan両方のコマンドで試しました。
どちらもerrorが出てしまったので、
ひとまずcpanmの方で書いています。

perbrew install perl-5.14.1 --as=perl-5.14.1-threaded -D=useithreads
cpanm Alien::SDL SDL

テストスクリプトはこんな感じです。ほぼManulにあったサンプルのまま。
最初にset_video_mode叩いた所でerrorになってるので
スクリプトの後半が動くかどうかは微妙ですが。。。

use SDL;
use SDL::Video;
use SDL::Surface;
use SDL::Rect;

my $screen_width  = 800;
my $screen_height = 600;

SDL::init(SDL_INIT_VIDEO);

my $screen_surface =  SDL::Video::set_video_mode(
    $screen_width,
    $screen_height,
    32, 
    SDL_ANYFORMAT
);
my $mapped_color = SDL::Video::map_RGB(
    $screen_surface->format(),
    0,
    0,
    255
);

SDL::Video::fill_rect(
    $screen_surface,
    SDL::Rect->new(
        $screen_width / 4,
        $screen_height / 4,
        $screen_width / 2,
        $screen_height / 2 
    ),  
    $mapped_color
);

SDL::Video::update_rect(
    $screen_surface,
    0,
    0,
    $screen_width,
    $screen_height
);

sleep(5);

最後にテストスクリプト叩いたときのerrorとstacktraceの中身。
※errorと一緒に大量のNSAutoreleaseNoPoolの
 warningが出るんですが
 googleで調べた感じだととりあえず無視して良さそうだったので、
 省略してます。

Sun Sep 11 15:19:13 kt-macbook.local perl[28145] <Error>:
kCGErrorInvalidConnection: CGSGetCurrentCursorLocation: 
Invalid connection
Sun Sep 11 15:19:13 kt-macbook.local perl[28145] <Error>:
kCGErrorFailure: Set a breakpont @ CGErrorBreakpoint() 
to catch errors as they are logged.
Sun Sep 11 15:19:13 kt-macbook.local perl[28145] <Error>: 
kCGErrorInvalidConnection: CGSGetCurrentCursorLocation: 
Invalid connection                                             
Sun Sep 11 15:19:13 kt-macbook.local perl[28145] <Error>:
kCGErrorInvalidConnection: CGSNewWindowWithOpaqueShape: 
Invalid connection                                             

2011-09-11 15:19:13.262 perl[28145:903] *** Terminating 
app due to uncaught exception 'NS
InternalInconsistencyException', reason: 'Error (1002) creating 
CGSWindow'               
*** Call stack at first throw:                                                           
(                                                                                        
    0   CoreFoundation
            0x00007fff857b27b4 __exceptionPreprocess + 180                                                                                        
    1   libobjc.A.dylib
            0x00007fff85182f03 objc_exception_throw + 45 
    2   CoreFoundation
            0x00007fff857b25d7 +[NSException raise:format
:arguments:] + 103                                                                       
    3   CoreFoundation
            0x00007fff857b2564 +[NSException raise:format
:] + 148                                                                                 
    4   AppKit
            0x00007fff89857f52 _NSCreateWindowWith
OpaqueShape2 + 473                                                                              
    5   AppKit
            0x00007fff897ec691 -[NSWindow _common
Awake] + 1214                                                                                    
    6   AppKit
            0x00007fff897e9376 -[NSWindow _common
InitFrame:styleMask:backing:defer:] + 1501                                                       
    7   AppKit
            0x00007fff897e8002 -[NSWindow _init
Content:styleMask:backing:defer:contentView:] + 1396                                               
    8   AppKit
            0x00007fff897e7a8b -[NSWindow init
WithContentRect:styleMask:backing:defer:] + 42                                                      
    9   libSDL-1.2.0.dylib
      0x000000010054e2ac -[SDL_QuartzWindow init
WithContentRect:styleMask:backing:defer:] + 349                                             
    10  libSDL-1.2.0.dylib
      0x000000010054a85e QZ_SetVideoWindowed + 832 
    11  libSDL-1.2.0.dylib
      0x000000010054b11c QZ_SetVideoMode + 169     
    12  libSDL-1.2.0.dylib
      0x000000010053cb0c SDL_SetVideoMode + 655    
    13  Video.bundle
      0x00000001005c911b XS_SDL__Video_set_video_mode + 347                                                                                 
    14  perl
               0x00000001000ad5c4 Perl_pp_entersub + 1764   
    15  perl
               0x00000001000a5bc6 Perl_runops_standard + 22 
    16  perl
              0x0000000100023e08 perl_run + 936            
    17  perl
              0x000000010000148b main + 315                
    18  perl
              0x0000000100001344 start + 52                
)                                                                                        
terminate called after throwing an instance of 'NSException'                             

このままっていうのも悔しいので
勉強がてら調査してみたい所です。
とりあえず英語と戦いながら、
forumとMLをもう少し探ってみようかな…。

参考リンク:
CPAN
http://search.cpan.org/~kthakore/SDL-2.533/
sdl.perl.org
http://sdl.perl.org/

同日追記
Manualそのままとか言いつつManual見直したらコードが全然違う上に
書いてたコードがレガシーな感じだったので
テストスクリプトを書き直しました。
出るerrorはまったく同じでしたが、
いったいどこを見て書いたんだと自分に問いかけたい。

use strict;
use warnings;
use SDL;
use SDLx::App;
my $app = SDLx::App->new();
sleep( 2 );

2011/09/17追記
原因が見つかったので追記。参考リンクは以下。

https://github.com/banthar/Go-SDL/issues/19

コードとしてはこんな感じになる。

use strict;
use warnings;
use SDL;
use SDLx::App;

SDL::putenv('SDL_VIDEODRIVER=X11');
my $app = SDLx::App->new();
sleep( 2 );

MacBookProのハード依存の問題っぽい。
X11のVideDriver使うように指定してあげる。