问题:
如何为需要“SDL.Surface”的函数提供“IO SDL.Surface”?
我宁愿重新考虑我的整个方法,也不愿诉诸使用“unsafePerformIO”之类的东西,除非这实际上是使用它的正确时间(我对此表示怀疑)。
更多信息:
我有一个填充了数字和文件路径的文件,我已经解析了这个文件并将位于这些路径的图像加载到列表 [(Int, IO SDL.Surface)] 中。问题是,SDL.blitSurface函数需要一个正常的 SDL.Surface。
错误信息:
Couldn't match type `IO SDL.Surface'
with `GHC.ForeignPtr.ForeignPtr SDL.SurfaceStruct'
Expected type: SDL.Surface
Actual type: IO SDL.Surface
我不确定是否需要源代码来回答这个问题,但我还是会提供一些以防万一:
要加载我使用的图像文件:
loadImage :: FilePath -> IO SDL.Surface
loadImage [] = error "empty list"
loadImage a =
SDL.loadBMP a
要创建我使用的数字和图像列表:
createIDImageList :: [Tiletype] -> [(Int, IO SDL.Surface)]
createIDImageList a =
if null a then []
else [(tiletypeid $ a !! 0, loadImage (C8.unpack ( tiletypeimage ( a !! 0))))] ++ createIDImageList (tail a)
为了从这个列表中检索正确的图片,我使用了这个函数:
imageFromID :: Int -> [(Int, IO SDL.Surface)] -> Maybe (IO SDL.Surface)
imageFromID a b =
if null b then Nothing
else if a == (fst $ b !! 0) then Just (snd $ b !! 0)
else imageFromID a (tail b)
最后我使用带有 SDL.blitSurface 的 imageFromID 来绘制图像,但由于 IO 的原因我不能。