import qualified Graphics.DrawingCombinators as Draw import qualified Graphics.UI.SDL as SDL import Data.Monoid resX = 640 resY = 480 initScreen :: IO () initScreen = do SDL.init [SDL.InitTimer, SDL.InitVideo] -- resolution & color depth SDL.setVideoMode resX resY 32 [SDL.OpenGL] Draw.init return () textBox :: Draw.Color -> Draw.Font -> String -> Draw.Image (Maybe String) textBox color font text = fmap (\(Any b) -> if b then Just text else Nothing) $ Draw.text font text `mappend` Draw.tint color (Draw.convexPoly [(1,1),(1,-1),(-1,-1),(-1,1)]) juxtapose :: (Monoid a) => Draw.Image a -> Draw.Image a -> Draw.Image a juxtapose d1 d2 = (Draw.translate (-1,0) Draw.%% Draw.scale 0.5 1 Draw.%% d1) `mappend` (Draw.translate (1,0) Draw.%% Draw.scale 0.5 1 Draw.%% d2) drawing :: Draw.Font -> Draw.Image (Maybe String) drawing font = juxtapose (textBox (Draw.Color 1 0 0 1) font "A") (textBox (Draw.Color 0 0 1 1) font "B") main :: IO () main = do initScreen font <- Draw.openFont "font.ttf" 72 Draw.clearRender (drawing font) SDL.glSwapBuffers waitClicks font SDL.quit return () where waitClicks font = do ev <- SDL.waitEvent case ev of SDL.Quit -> return () SDL.MouseButtonDown x y _ -> do let x' = 2*(fromIntegral x / fromIntegral resX) - 1 let y' = 1 - 2*(fromIntegral y / fromIntegral resY) hit <- Draw.sample (x',y') (drawing font) case hit of Nothing -> waitClicks font Just str -> putStrLn str >> waitClicks font _ -> waitClicks font untilM :: (Monad m) => (a -> Bool) -> m a -> m a untilM f m = do x <- m if f x then return x else untilM f m