我希望在窗口中的屏幕上绘制单个像素,或者在haskell中实时显示。
我刚开始使用haskell(但不是函数式编程,而不是图形),所以我试图用它创建一些基本的图形内容。
我曾尝试使用SDL,但以下代码为我提供了一个空白屏幕:
import Prelude
import Graphics.UI.SDL as SDL
createColor screen r g b = SDL.mapRGB (SDL.surfaceGetPixelFormat screen) r g b
drawGrad screen = SDL.setColors screen [SDL.Color x y 255 | x <- [0..255], y <- [0..255]] 800
main = do
SDL.init [InitEverything]
setVideoMode 256 256 32 []
screen <- getVideoSurface
drawGrad screen
SDL.flip screen
quitHandler
quitHandler :: IO ()
quitHandler = do
e <- waitEvent
case e of
Quit -> return ()
otherwise -> quitHandler
答案 0 :(得分:2)
在我看来,你实际上并没有绘制。你确定setColors做你认为它做的吗?如果内存为我服务,则用于设置8位表面的调色板,而您明确设置32位视频模式。
顺便说一句,如果你确定之前你已经完成了图形编程你知道其中的差异,但为了其他人的利益而阅读:8位视频模式将像素颜色存储为从一组更大的潜在颜色中选择的256色表中的8位索引;在更高的颜色深度,调色板表被省略,每个像素颜色直接存储为打包的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 <- createColor surf x y 255
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程序员,我的建议不应被视为正确使用该语言的指示。仅限于外用。不要嘲笑Happy Fun IO Monad。
无论哪种方式,我认为你的问题在于使用SDL,而不是Haskell。 Graphics.UI.SDL非常原始,只不过将C API包装在适当的Haskell类型中。如果您以前没有使用过SDL,或者仅使用稍微复杂的绑定(例如,PyGame),您可能需要考虑在C中查找SDL示例作为参考材料。
答案 1 :(得分:1)
我知道这个问题大约有一年的历史,但这里有误导性的答案,你可以用Haskell SDL绑定进行像素操作,查看我的代码示例,如何做,它是port of LazyFoo's SDL tutorial 31