سؤال

أود أن أقسم بكسل فرديا على شاشة في نافذة أو شيء ما للعرض في الوقت الفعلي في 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top