GUI入門
DXライブラリとHSPでしか
まともにGUIアプリを作成したことのない私が、
HaskellでOpenGLをいじる、不定期連載。
OpenGLがそもそもどういうものなのか、そこから知る必要がありましたが、その際、次の本が大変参考になったので紹介しておきます。
「OpenGL入門–やさしいコンピュータグラフィックス」
この本を読んで、OpenGLがどのようなものか概要を知ることができました。
なので。
まずは簡単なグラフ描画を行います。
何気にViewPatternsを使ってる笑
ソースコードはこちら
無駄は多いのですが。
「とにかく先ずは動くものを」精神。
見たらわかるように、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で作成するときはこれを検証してみたい。