ESDLを試したけど、失敗した。その2

前回のエントリ: http://d.hatena.ne.jp/mzp/20090102/esdl
30分プログラム、その508。こりずにErlangSDLバインディング、ESDLを試して、またも失敗した。

本当は、サーフェイスのピクセルデータを自分でごにょごにょして加算合成じゃい、αブレンディングじゃい、と遊ぶつもりだったけど、うまくサーフェイスが作れない。 たぶん、ボクがSDLを使いこなせていないのと、ESDLが一部の関数しかErlangインタフェースを用意してないのが原因だと思う。

使い方

1> sdl_test:go().

ソースコード

-module(sdl_test).
-compile([export_all]).

-include_lib("esdl/include/sdl.hrl").
-include_lib("esdl/include/sdl_video.hrl").
-include_lib("esdl/include/sdl_events.hrl").

load(Path) ->
    Bmp = sdl_video:loadBMP(Path),
    Surface = sdl_video:createRGBsurface(?SDL_SWSURFACE,300,300,24,16#FF,16#FF00,16#FF0000,0),
    sdl_video:blitSurface(Bmp,null,Surface,null),
    Surface.

mapSurface(F,Surface)->
    Pixels = sdl_video:getPixels(Surface,#sdl_rect{x=0,y=0,w=300,h=300}),
    sdl_video:createRGBsurfaceFrom(F(Pixels),?SDL_SWSURFACE,300,300,24,16#FF,16#FF00,16#FF0000,0).

go() ->
    _Server = sdl:init(?SDL_INIT_VIDEO),
    sdl_util:debug(1),
    ScreenRef = sdl_video:setVideoMode(640, 480, 8, ?SDL_ANYFORMAT bor ?SDL_RESIZABLE),
    Screen = sdl_video:getSurface(ScreenRef),
    sdl_video:blitSurface(mapSurface(fun(X)->X end,load("air.bmp")),null,Screen,null),
    sdl_video:updateRect(Screen,0,0,640,480),
    loop().

loop() ->
    case sdl_events:waitEvent() of
	#quit{} ->
	    exit(normal);
	_ ->
	    loop()
    end.