私はHaskellの経験があまりなく、Gtk2Hを使い始めたばかりなので、これはばかげた質問かもしれません。
次のLine
タイプを定義しています。
type Coord = (Int,Int)
type Line = (Coord,Coord)
Line
そして、にsのリストを描画する関数がありますDrawingArea
。問題は、この関数がすべてのLine
sを同時に描画することですが、2つの秒の間に少し遅れて一度に1つずつ描画したいと思いLine
ます。
render :: [Line] -> IO ()
render lines =
do initGUI
win <- windowNew
windowSetTitle win "Animation"
win `onDestroy` mainQuit
can <- drawingAreaNew
can `onSizeRequest` return (Requisition 400 400)
can `onExpose` drawCanvas lines can
but <- buttonNewWithLabel "Quit"
but `onClicked` mainQuit
hbox <- hBoxNew False 0
boxPackStart hbox but PackRepel 150
vbox <- vBoxNew False 5
containerAdd vbox can
containerAdd vbox hbox
containerAdd win vbox
widgetShowAll win
mainGUI
この関数は、DrawingArea
が公開されたときに呼び出されます。
drawCanvas :: [Line] -> DrawingArea -> event -> IO Bool
drawCanvas lines can _evt =
do dw <- widgetGetDrawWindow can
drawWindowClear dw
gc <- gcNew dw
mapM_ (\(a,b) -> drawLine dw gc a b) lines
return True
StateT
まだ描画されていないものを追跡するためにを使用することを検討しましたLine
が、アニメーションの実装方法がわかりません。widgetShowAll
状態を変更してから毎回呼び出す場合でも、mainGUI
が呼び出されるまでウィンドウは表示されません。
drawCanvas
どういうわけか描画を処理しながら、状態を継続的に更新する新しいスレッドを作成することは可能ですか?もしそうなら、誰かがそのような行動の例を教えてくれませんか?それとももっと良いアプローチがありますか?