hdn

[トップ][一覧][最近の更新]


前書き/目的/前提/方針/その他

個別仕様について

開発環境の構築

以降は、個人的な設定メモ。

  1. 分かりやすいように、Haskell専用ワークディレクトリを用意する。
  2. コンソール操作をする事が割と多い気がするので、このワークディレクトリ内でcmd.exeまたはそれに類するシェルを起動できるようにしておくと便利。
  3. プロジェクトを始める場合、このディレクトリ内にプロジェクト名のディレクトリを作り、その中で作業する事にする。

適当に書いてみたサンプル類

エディタ設定を整える(vim用)

調べてみたところ、複数のhaskell.vimが存在するようだ。

両方同時入れるのはどうも無理っぽいようなので、前者の方をベースに、後者のctrl+Tのインデント位置移動の機能だけコピペしてもらってきた。

尚、vimballのインストールもctrl+Tの機能もvim7以降じゃないと機能しないっぽいようだ。

  1. vimballのファイルをもらってきて、vimで開き、「:UseVimball」でインストール。
  2. その後、インストールされたvimfiles/ftplugin/haskell.vim を開いて、以下を追記し、ctrl+Tのインデント位置移動を使えるようにする。
    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
    

モジュールを書く (1)

色々調べた結果、hsSDLにはSDL_WM_SetIconのバインディングが抜けている事が分かった。

しかし、別作者によるhaskell用SDLバインディングであるHSDLには、SDL_WM_SetIconのバインディングがある。 つまり、これはhsSDLの不備だ。

別にSDL_WM_SetIconが無くても大して困らないが、練習の為にこの機能を使えるようにしてみる。 仕様としては、今回作るモジュールをimportすると「setIcon」関数がimportされ、それを呼ぶとSDL_WM_SetIconが実行されるものとする。

  1. SDLMisc.hscを書いてみた。
    {-# 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を見ながらコピペで書いた。
  2. hscをhsに変換する。
    hsc2hs -IF:\ghc\include\SDL SDLMisc.hsc
    
    これで、SDLMisc.hscからSDLMisc.hsが生成される。
  3. 使う。
  4. コンパイルし、動かし、実行プロセスのアイコンが画像のものになった事を確認する。

プロトタイプの作成 (1)

この時点で一度、ゲームのプロトタイプを作る。

作った。

ものすごく適当で、色々とハードコーディングしすぎている。

が、とりあえずそれなりに動く物が作れる事は実証された。

メモリリークもしていないようだ。

問題点

バイナリのサイズ問題

SDLの前に、この辺りから調べた方が良さそうだ。

調べた。

stripと言えば、binutils付属のstripコマンドもあった。

この後、SDLの非mingw版利用等、他の手法も試す。あとで。

プロトタイプの作成 (2)

Monadiusの人の書いたドキュメントを読んで、「ああ、やっぱり、Haskellでは設計からちゃんとやるべきなんだな」と思い、前回作ったプロトタイプはあまりにもハードコーディングしすぎていたので、もう少しだけ抽象化を進めたプロトタイプを作ってみる事にした。

作ってみた……が、どうも上手く抽象化できたとは言えない。

どうにも、「Haskellでのゲーム開発は色々と問題があるんじゃないか?」と思うようになってしまった。

問題点

開発環境の構築 (2)

色々と修正し、hdn:開発環境構築に移動した。

各種の問題が、ある程度は解決した。

無駄に時間がかかった。

プロトタイプの作成 (3)

適当に作った。

プロトタイプの作成 (4)

続きはあとで。

今後の予定

その他のメモ

この項目は、あとで個別項目に移動させる事。

参考リンク

ものすごい未整理。今のところ、適当に追記してるだけ。あとで整頓する。


最終更新 : 2008/02/01 01:32:51 JST