3

Windowsの画面などに個々のピクセルを描画して、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
4

2 に答える 2

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プログラマーではないので、私のアドバイスは言語の正しい使用を示すものと見なされるべきではありません。外用のみ。HappyFunIOモナドを罵倒しないでください。

いずれにせよ、あなたの問題はHaskellではなくSDLの使用にあると思います。Graphics.UI.SDLはかなり生で、CAPIを適切なHaskellタイプでラップするだけです。以前にSDLを使用したことがない場合、または少し複雑なバインディング(PyGameなど)でのみ使用した場合は、参照資料としてCでSDLの例を探すことを検討してください。

于 2009-12-07T15:23:23.570 に答える
1

この質問は約1年前のものですが、ここには誤解を招く答えがあります。HaskellSDLバインディングを使用してピクセル操作を行うことができます。たとえば、コードを確認してください。これは、LazyFooのSDLチュートリアル31の移植版です。

于 2010-11-21T17:00:46.380 に答える