以降は、個人的な設定メモ。
ghc --make filename.hsghciから「:main」での実行はできない点に注意。
調べてみたところ、複数のhaskell.vimが存在するようだ。
両方同時入れるのはどうも無理っぽいようなので、前者の方をベースに、後者のctrl+Tのインデント位置移動の機能だけコピペしてもらってきた。
尚、vimballのインストールもctrl+Tの機能もvim7以降じゃないと機能しないっぽいようだ。
inoremap <C-T> _<BS><ESC>:call <SID>Indent()<CR>i function! s:Indent() let pos = getpos('.') let lnum = pos[1] let cnum = pos[2] if lnum == 1 return endif let line = getline('.') if line =~ '^\s*$' | execute 'normal a ' | endif normal ^kW let indent_pos = getpos('.') if indent_pos[1] >= lnum call cursor(lnum - 1, 0) normal ^ let indent_pos = getpos('.') endif normal j s/^\s*/\=repeat(' ', line =~ '^\s*$' ? indent_pos[2] : indent_pos[2] - 1)/ let new_line = getline('.') call cursor(lnum, cnum + len(new_line) - len(line) + 1) endfunction
色々調べた結果、hsSDLにはSDL_WM_SetIconのバインディングが抜けている事が分かった。
しかし、別作者によるhaskell用SDLバインディングであるHSDLには、SDL_WM_SetIconのバインディングがある。 つまり、これはhsSDLの不備だ。
別にSDL_WM_SetIconが無くても大して困らないが、練習の為にこの機能を使えるようにしてみる。 仕様としては、今回作るモジュールをimportすると「setIcon」関数がimportされ、それを呼ぶとSDL_WM_SetIconが実行されるものとする。
{-# OPTIONS -fglasgow-exts #-} module SDLMisc( setIcon, ) where import Foreign import Foreign.C import Control.Monad import Graphics.UI.SDL #include <SDL.h> -- extern DECLSPEC void SDLCALL SDL_WM_SetIcon(SDL_Surface *icon, Uint8 *mask); foreign import ccall unsafe "SDL.h SDL_WM_SetIcon" inSDLWMSetIcon :: Ptr SurfaceStruct -> Ptr Word8 -> IO () setIcon :: Surface -> Maybe Word8 -> IO () setIcon icon mbMask = withForeignPtr icon $ \ptr -> maybeWith Foreign.with mbMask $ \mask -> inSDLWMSetIcon ptr mask基本的に、hsSDLとHSDLの*.hscを見ながらコピペで書いた。
hsc2hs -IF:\ghc\include\SDL SDLMisc.hscこれで、SDLMisc.hscからSDLMisc.hsが生成される。
import SDLMisc
icon <- SDLImage.load "test.bmp" setIcon icon Nothing freeSurface icon
この時点で一度、ゲームのプロトタイプを作る。
作った。
ものすごく適当で、色々とハードコーディングしすぎている。
が、とりあえずそれなりに動く物が作れる事は実証された。
メモリリークもしていないようだ。
SDLの前に、この辺りから調べた方が良さそうだ。
調べた。
--overlay=strip strip any extra data attached to the file [DANGEROUS]なんか、「DANGEROUS」って書いてあるんだが。
stripと言えば、binutils付属のstripコマンドもあった。
strip -s hsddd01.exe2.3Mが1.1Mになった。バイナリの半分以上がシンボルでできていたのか……。
この後、SDLの非mingw版利用等、他の手法も試す。あとで。
Monadiusの人の書いたドキュメントを読んで、「ああ、やっぱり、Haskellでは設計からちゃんとやるべきなんだな」と思い、前回作ったプロトタイプはあまりにもハードコーディングしすぎていたので、もう少しだけ抽象化を進めたプロトタイプを作ってみる事にした。
作ってみた……が、どうも上手く抽象化できたとは言えない。
どうにも、「Haskellでのゲーム開発は色々と問題があるんじゃないか?」と思うようになってしまった。
C:\path\to\Temp\ghc6304_0\ghc6304_0.hc:9:41 Graphics\UI\SDL\TTF\Wrapper.h: No such file or directoryghcが内部で生成しているファイルらしく、該当ディレクトリを見てもこの*.hcファイルは見付からなかった。
色々と修正し、hdn:開発環境構築に移動した。
各種の問題が、ある程度は解決した。
無駄に時間がかかった。
適当に作った。
続きはあとで。
この項目は、あとで個別項目に移動させる事。
windres src.rc result.coffまたは、既に*.res形式になっているなら
windres src.res result.coffこれをghcに渡す。
ghc --make hoge.hs result.coff ...
ものすごい未整理。今のところ、適当に追記してるだけ。あとで整頓する。