Frage

Ich möchte einzelne Pixel auf einem Bildschirm in einem Fenster oder etwas für Echtzeit-Display in Haskell zeichnen.

Ich fange gerade erst mit Haskell an (aber nicht mit funktionaler Programmierung und nicht mit Grafiken), also versuche ich, mit ihm einige rudimentäre Grafik -Dinge zu erstellen.

Ich habe versucht, SDL zu verwenden, aber der folgende Code gibt mir einen leeren Bildschirm:

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
War es hilfreich?

Lösung

Es sieht für mich so aus, als ob du es nicht bist Zeichnung alles da. Sind Sie sicher, dass SetColors das tun, was Sie denken? Wenn mir der Speicher dient, wird die Farbpalette für eine 8-Bit-Oberfläche festgelegt, während Sie explizit einen 32-Bit-Videomodus einstellen.

Abgesehen davon, wenn Sie Grafikprogramme vorgenommen haben, bevor ich sicher bin, dass Sie Kennen Sie den Unterschied, aber zum Nutzen anderer, die dies lesen: 8-Bit-Videomodi speichern Pixelfarben als 8-Bit-Index in eine Tabelle mit 256 Farben aus einem viel größeren Satz potenzieller Farben; In höheren Farbtiefen wird der Palettentisch mit und jede Pixelfarbe direkt als verpacktes RGB-Triple gespeichert, typischerweise von jeweils 8 Bit (32-Bit-Pixel haben entweder einen 8-Bit Polsterung für eine bessere Speicherausrichtung, ich kann mich nicht erinnern).

In jedem Fall, wenn ich richtig schätze, was Sie versucht haben, versuchen Sie dies zu Ihrem Programm hinzuzufügen:

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))

Warnung: Das ist mit ziemlicher Sicherheit schrecklicher und ineffizienter Code und wurde nur in einer Win32 -Umgebung getestet. Ich bin kein qualifizierter Haskell -Programmierer und mein Rat sollte nicht als Hinweis auf die korrekte Verwendung der Sprache angesehen werden. Nur für äußere Anwendung. Verspotten Sie den glücklichen Spaß nicht.

In jedem Fall denke ich, dass Ihr Problem bei der Verwendung von SDL, nicht von Haskell liegt. Graphics.ui.sdl ist ziemlich roh und kaum mehr als das Wickeln der C -API in geeignete Haskell -Typen. Wenn Sie SDL zuvor noch nicht verwendet oder nur mit etwas ausgefeilteren Bindungen (z. B. PyGame) verwendet haben, sollten Sie in Betracht ziehen, nach SDL -Beispielen in C als Referenzmaterial zu suchen.

Andere Tipps

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top