PDA

View Full Version : [Haskell][Gloss] Generare una lista di Picture


sic2
27-11-2011, 19:19
Ciao a tutti!

devo implementare della grafica in Haskell usando Gloss.

Ho una lista di dati e in base al valore dell'elemento nella lista devo "disegnare" qualcosa di diverso (per esempio dei rettangoli di colore diverso)

Questo è il codice che devo implementare:


drawSystem :: Dati -> Picture


dove Dati è un record da cui posso accedere a una lista.

Quello che ho scritto per ora è:
drawSystem :: Dati -> Picture
drawSystem dati = Pictures $ lista dati

Dove la lista dati ritorna una lista di immagini --> [Picture]

Tuttavia il compilatore ghc mi da errore dicendomi non posso mettere una lista in Pictures.

Ogni aiuto è gradito.....

marco.r
27-11-2011, 20:51
dovresti mostrare che codice stai usando o perlomeno quali librerie, altrimenti e' impossibile capire.
Ad esempio quel "Pictures" da dove arriva ?

sic2
27-11-2011, 22:32
Ecco:


import Graphics.Gloss
import Graphics.Gloss.Interface.Simulate

drawSystem :: Dati -> Picture
drawSystem dati = Pictures $ listPicture (lista dati)

runVM :: System -> IO ()
runVM s = simulateInWindow "GAME" (700, 560) (50, 50) black 1
s drawSystem (\_ _ s -> step s)


listPicture :: [Dato] -> [Picture]
listPicture [] = Blank
listPicture (s : sc)
| (instruction s) == DAT = (Color white (Line [(fromIntegral (20), -10),
(fromIntegral((20) + 20), -10)])) : (listPicture sc)
| otherwise = Blank + listPicture sc


Ovviamente le coordinate in Line non sono corrette ma il problema non è quello.

Sbaglio forse a creare la lista in modo ricorsivo? O altrove?

marco.r
27-11-2011, 22:55
Ops, mi era sfuggito che nel titolo menzionavi Gloss...
Riesci a riportare l'errore preciso ?

sic2
28-11-2011, 21:59
Risolto.

Praticamente quando voglio creare una lista di Picture scrivo questo:



metodo (_ : _) = Pictures[Blank]
metodo (head : tail) = Pictures[ "qui va la creazione di un immagine", metodo tail]


Grazie comunque del supporto! :)

Spero inoltre che la soluzione da me trovata possa essere d'aiuto a qualcun'altro in futuro.