2009-12-06 69 views
3

我希望在窗口中的某個屏幕上繪製單個像素或用於在haskell中進行實時顯示。Haskell像素繪圖庫linux

我剛剛開始使用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

我不看看如何做到這一點。我認爲SDL希望您將像素直接寫入表面;但'SDL.surfaceGetPixels'的返回類型沒有公開。如果是這樣,我想可以使用'withForeignPtr'。 – 2009-12-09 15:24:34

+1

@Jason Orendorff - 這不是真的,實際上返回類型是一個Ptr到一個空的數據聲明(這是合法的),這迫使你使用castPtr這是有道理的,因爲指針的實際類型將取決於表面的格式(比特深度,像素格式等)。看看我的答案,看看如何去做。 – 2010-11-21 17:04:45

回答

2

它看起來對我來說,你是不是真正繪製任何那裏。你確定setColors做你認爲它做的?如果內存爲我提供服務,則用於設置8位表面的調色板,而您明確設置32位視頻模式。順便說一句,如果你已經完成了圖形編程,我肯定知道的區別,但爲了他人的利益讀取此:8位視頻模式存儲像素顏色作爲一個8位索引轉換成256種顏色的表格,從更大的一組潛在顏色中選擇;在較高的顏色深度中,調色板表被省略,並且每個像素顏色直接存儲爲壓縮RGB三元組,通常每個8位(32位像素也具有8位阿爾法通道,或者僅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示例作爲參考材料。

+0

我覺得這樣雖然慢,但我學會了如何在稍後更快地學習。 – solinent 2009-12-08 18:56:26

+0

檢查我的答案,看看如何做到這一點正確高效的方式。 – 2010-11-21 17:06:27

1

我知道這個問題是一歲左右,但也有在這裏誤導性的答案,你可以用哈斯克爾SDL綁定像素操作,檢查我的代碼,比如怎麼做,這是一個port of LazyFoo's SDL tutorial 31

+0

您應該發佈代碼,而不是鏈接。 (特別是因爲它看起來像你刪除了你的github項目。) – 2016-07-19 12:06:44