perlのSDLではまっている途中(解決済み)。
※問題解決したサンプルコードは一番下に記述しました。
SDLのperlバインディングを触ってみようかと思い立ってみたのですが
未だにサンプルすら動かない有様です。
そろそろ潮時感が出てきたので、
動かないなりに、やったことを書き残してみます。
試した環境:
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使うように指定してあげる。