module Resource where import qualified Graphics.UI.SDL as SDL import qualified Graphics.UI.SDL.Mixer as SDLMixer -- リソース data Resource = Resource { imageResource :: [Image], soundResource :: [Sound] } addImageResource :: Resource -> String -> IO Resource addImageResource res filename = let imgRes = imageResource res in if lookup filename imgRes /= Nothing then return res else do img <- newImage filename return res { imageResource = (img:imgRes) } addSoundResource :: Resource -> String -> IO Resource addSoundResource res filename = let sndRes = soundResource res in if lookup filename sndRes /= Nothing then return res else do snd <- newSound filename return res { soundResource = (snd:sndRes) } -- 画像 type Image = (String, SDL.Surface) newImage :: String -> IO Image newImage filename = do -- putStrLn $ "loading " ++ filename surface <- SDL.loadBMP filename pixel <- SDL.mapRGB (SDL.surfaceGetPixelFormat surface) 0 255 0 SDL.setColorKey surface [SDL.SrcColorKey, SDL.RLEAccel] pixel display <- SDL.displayFormat surface return (filename, display) -- 画像ファイルの一区画 type PaintTip = (String, Maybe SDL.Rect) -- 画像と描画先 type Paint = (PaintTip, Maybe SDL.Rect) renderPaint :: Resource -> SDL.Surface -> Paint -> IO Bool renderPaint res surf ((filename, r1), r2) = let (Just imgSurf) = lookup filename (imageResource res) in do SDL.blitSurface imgSurf r1 surf r2 -- 音声 type Sound = (String, SDLMixer.Chunk) newSound :: String -> IO Sound newSound filename = do -- putStrLn $ "loading " ++ filename chunk <- SDLMixer.loadWAV filename return (filename, chunk) playSound :: Resource -> String -> Int -> IO () playSound res filename times = let (Just chunk) = lookup filename (soundResource res) in do SDLMixer.playChannel (-1) chunk times return () haltSound :: IO () haltSound = SDLMixer.haltChannel (-1)