在我看来,您实际上并没有在此处绘制任何内容.您确定setColors会按照您的想法工作吗?如果需要内存,那是为8位表面设置调色板,而您明确地设置为32位视频模式.
顺便说一句,如果您确定之前已经完成了图形编程,那么我会知道其中的区别,但是对于其他阅读者来说,这是有益的:8位视频模式将像素颜色作为8位索引存储到256色表中从更大的一组潜在颜色中进行选择;在较高的颜色深度时,就不需要使用调色板表,而是将每个像素颜色直接存储为打包的RGB三元组,通常每个像素为8位(32位像素也具有8位alpha通道,或者只有8位填补更好的内存对齐方式,我不记得了).
无论哪种方式,如果我猜对了您要尝试执行的操作,请尝试将其添加到您的程序中:
import Ix
-- Given coordinates, create a 1x1 rectangle containing that pixel
getPix x y = SDL.Rect (fromIntegral x) (fromIntegral y) 1 1
-- Draw a pixel on a surface with color determined by position
drawPixel surf (x, y) = do
let pixRect = Just (getPix x y)
pixColor
SDL.fillRect surf pixRect pixColor
-- Apply drawPixel to each coordinate on the screen
drawGrad screen = mapM_ (drawPixel screen) $range ((0,0),(255,255))
警告:几乎可以肯定,这是可怕而低效的代码,并且仅在Win32环境中进行了测试.我不是合格的Haskell程序员,因此不应将我的建议视为正确使用该语言的指示.仅限于外用.不要嘲笑快乐乐团IO Monad.
无论哪种方式,我都认为您的问题在于使用SDL,而不是Haskell. Graphics.UI.SDL非常原始,只不过是将C API包装在适当的Haskell类型中.如果您以前没有使用过SDL,或者仅使用了稍微复杂一些的绑定(例如PyGame),则可能需要考虑在C中寻找SDL示例作为参考资料.