Haskell بكسل رسم مكتبة لينكس
سؤال
أود أن أقسم بكسل فرديا على شاشة في نافذة أو شيء ما للعرض في الوقت الفعلي في 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
المحلول
يبدو لي وكأنك لست في الواقع رسم أي شيء هناك. هل أنت متأكد من Seedcolors يفعل ما تعتقد أنه يفعل؟ إذا كانت الذاكرة تخدمني، فهي لإعداد لوحة الألوان لسطح 8 بت، بينما كنت تقوم بتعيين وضع فيديو 32 بت بشكل صريح.
جانبا، إذا كنت قد قمت برمجة الرسومات قبل أن أكون متأكدا أنت تعرف على الفرق، ولكن لصالح الآخرين يقرأون هذا: متجر فيديو 8 بت مخزن الألوان بكسل كمؤشر 8 بت في جدول يضم 256 لونا مختارة من مجموعة أكبر بكثير من الألوان المحتملة؛ في أعماق اللون الأعلى، يتم الاستغناء عن طاولة اللوحة مع ويتم تخزين كل لون بكسل مباشرة ككلمة ثلاثية RGB معبأة، عادة من 8 بت من 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 مؤهل ولا ينبغي أن تؤخذ نصيحتي مؤشرا على الاستخدام الصحيح للغة. للاستخدام الخارجي فقط. لا تسخر من المرح السعيد IO مناد.
في كلتا الحالتين، أعتقد أن مشكلتك تكمن مع استخدام SDL، وليس Haskell. Graphics.ui.sdl هو RAW جدا، أكثر بقليل من التفاف API C في أنواع Haskell المناسبة. إذا لم تكن قد استخدمت SDL من قبل، أو استخدامها فقط مع ربط أكثر طفيفة (مثل Pygame)، فقد ترغب في النظر في البحث عن أمثلة SDL في C كمواد مرجعية.
نصائح أخرى
أعلم أن هذا السؤال يبلغ من العمر حوالي عام ولكن هناك إجابات مضللة هنا، يمكنك القيام بمعالجة البكسل مع ارتباطات Haskell SDL، والتحقق من التعليمات البرمجية الخاصة بي على سبيل المثال حول كيفية القيام بذلك، إنها ميناء Lazyfoo's SDL التعليمي 31