wvogel日記

自分用の技術備忘録が多めです.

GUI入門

DXライブラリとHSPでしか
まともにGUIアプリを作成したことのない私が、
HaskellOpenGLをいじる、不定期連載。


OpenGLがそもそもどういうものなのか、そこから知る必要がありましたが、その際、次の本が大変参考になったので紹介しておきます。
「OpenGL入門–やさしいコンピュータグラフィックス」

この本を読んで、OpenGLがどのようなものか概要を知ることができました。

なので。
まずは簡単なグラフ描画を行います。
何気にViewPatternsを使ってる笑
ソースコードはこちら


sin関数。

綺麗

無駄は多いのですが。
「とにかく先ずは動くものを」精神。


見たらわかるように、main.hs内のmain関数。
ここがGUI描画の司令塔です。
一般に次のような形をとります。

import Graphics.UI.GLUT

main
 = do getArgsAndInitialize
      initialWindowSize $= Size 600 400
      initialWindowPosition $= Position 100 100
      initialDisplayMode $= [DoubleBuffered , RGBMode]

      createWindow "test"

      displayCallback $= myDrawer
                --myDrawer :: コールバック関数に指定する描画関数
      mainLoop

一番大事なのは、displayCallbackに指定する関数で、
これが描画の実際の処理を行っていきます。


また、今回作成したものでは使用しませんでしたが、

keyboardMouseCallback

というコールバック関数を使えば、
外部入力によるアクションを加えられます。

IORefやStateモナドを使って外部入力をデータの状態に反映して
更新してやればゲームなども作れます。



はじめ、外部からの入力(矢印キー)によって
軸を可動にしようかと思いましたが、実際にやってみると。
ほとんど全てについてIORefがついて回る....


管理しやすくしようとすると、
しっかり固めてから書きなおす必要があると思い、
今回は扱わないことにしました。


また、GUIのように描画が中心となると、
純粋な関数での作業が難しい、という話をたまにみかけます。
今回作成した規模ではそれを検証するほどには至りませんでした。
使用した関数はせいぜい座標変換くらいなので。

感想

・GUIは思うほど難しくない!

・外部アクションによってデータを更新する必要がある場合、
 IORefがあらゆる関数についてまわるので、
 ある程度ちゃんと構成を固めてからでないと辛い。


しかしそれならば、
IORefを使わずアクションを処理する方法はないのだろうか。
次回GUIで作成するときはこれを検証してみたい。