Ich bin verpflichtet, eine einfache Animation mit haskell
Glanz zu erstellen. Ich möchte, dass in den ersten 4 Sekunden jedes Rechteck seine Farbe in eine dunklere ändert. Das Problem ist, dass nach einer relativ langen Zeit der Verlinkung, passiert nichts wirklich -Gloss Funktion `animiert` scheint nichts zu tun
Alle Rechtecke erscheinen und sie ändern sich nicht Farbe
Dies ist der folgende Code i verwendet -
window :: Display
window = InWindow "Simon" (width, height) (offset, offset)
background :: Color
background = black
data SimonGame = Game {
rectangleGreen::Picture,
rectangleRed::Picture,
rectangleBlue::Picture,
rectanglYellow::Picture
} deriving Show
initialState :: SimonGame
initialState = Game
{ rectangleGreen = translate (-100) (0) $ color green $ rectangleSolid 60 60,
rectangleRed = translate (100) (0) $ color red $ rectangleSolid 60 60,
rectangleBlue = translate (0) (100) $ color blue $ rectangleSolid 60 60,
rectanglYellow = translate (0) (-100) $ color yellow $ rectangleSolid 60 60
}
render :: SimonGame -> Picture
render game = pictures
[ rectangleGreen game,
rectangleRed game,
rectangleBlue game,
rectanglYellow game
]
updateBoard :: Float-> SimonGame -> SimonGame
updateBoard 1.0 game = game {
rectangleGreen = translate (-100) (0) $ color (dark green) $ rectangleSolid 60 60,
rectangleRed = translate (100) (0) $ color red $ rectangleSolid 60 60,
rectangleBlue = translate (0) (100) $ color blue $ rectangleSolid 60 60,
rectanglYellow = translate (0) (-100) $ color yellow $ rectangleSolid 60 60
}
updateBoard 2.0 game = game {
rectangleGreen = translate (-100) (0) $ color green $ rectangleSolid 60 60,
rectangleRed = translate (100) (0) $ color (dark red) $ rectangleSolid 60 60,
rectangleBlue = translate (0) (100) $ color blue $rectangleSolid 60 60,
rectanglYellow = translate (0) (-100) $ color yellow $rectangleSolid 60 60
}
updateBoard 3.0 game = game {
rectangleGreen = translate (-100) (0) $ color green $ rectangleSolid 60 60,
rectangleRed = translate (100) (0) $ color red $ rectangleSolid 60 60,
rectangleBlue = translate (0) (100) $ color (dark blue) $rectangleSolid 60 60,
rectanglYellow = translate (0) (-100) $ color yellow $rectangleSolid 60 60
}
updateBoard 4.0 game = game {
rectangleGreen = translate (-100) (0) $ color green $ rectangleSolid 60 60,
rectangleRed = translate (100) (0) $ color red $ rectangleSolid 60 60,
rectangleBlue = translate (0) (100) $ color blue $rectangleSolid 60 60,
rectanglYellow = translate (0) (-100) $ color (dark yellow) $rectangleSolid 60 60
}
updateBoard _ game = game
main :: IO()
main = animate window background frame
where
frame :: Float -> Picture
frame seconds = render $ updateBoard seconds initialState
Meine Vermutung ist, dass die Muster Übereinstimmungen auf '1.0',' 2.0', etc. sind fehlgeschlagen und Sie sind auf der '_' Fall übereinstimmen. Vielleicht machen Sie vorübergehend den _ _ Fall genauso wie den '4.0' Fall und sehen Sie, ob sich das anders verhält. Kennst du die Tücken beim Vergleich von Fließkommazahlen? –
[Was jeder Informatiker über Fließkomma-Arithmetik wissen sollte] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html). (Aber das Problem mit Ihrem Code ist eigentlich grundlegender als die typischen Float-Probleme.) – leftaroundabout
Eine andere Sache: Bitte schreiben Sie keinen solchen repetitiven Code wie in 'updateBoard'. – leftaroundabout